BehaviorTree implement with pure C# ★ Event Driven & Observer Abort
暂时搁置,目前需要先带入已有项目再沉淀一下.
Unity现有两款比较有名的插件
Behavior Designer - Behavior Trees for Everyone
有以下几点我觉得不太适合我的
Behavior Designer 这块做的是最差的. 只要相应的CustomNode创建后 完全无法重构,即使换个路径就会导致之前的BT文件直接报红. 并且你还完全无法知道到原来的Node是什么.
Node Canvas 有自制一个工具方便重构,并且还会提示你Missing的Node原本是什么. 这点做的就比较好了. 虽然重构费劲. 但是至少是可以.
并且Behavior Designer在这块埋下了一个非常大的隐患,尤其是多人合作的开发周期比较长的商业游戏. 很难说谁做了点什么操作导致之前文件损坏.代码回滚起来会异常麻烦.
所以 如果是大型项目 个人完全建议优先选择Node Canvas
Behavior Designer应该是无可能性,Node Canvas有单独生成AOT文件.理论可行 但是需要后期做大量辅助工具. 过于复杂了.
两款插件都有Abort机制,但是都没有Build-In支持CanNotAbort State.
比如一个节点需要控制Actor节点释放Skill去Attack. 在Skill的前摇阶段. 此时前置节点需要Trigger Abort. 比如中了一个Fear的Buff需要逃跑. 预期达到的效果是Skill前摇结束后 转入Fear的Logic.
这块简单的处理是BB中加入一个IsCanNotAbort的变量,然后每个可以Abort的Condition检测时候都要带着这个参数去检测.
- 这样BT的前置判断节点都需要 + Sequencer
- 并且这样操作以后无法处理 Skill执行完毕后仍旧触发Fear的Logic(如果Fear的Logic是One Time的话).
这个问题第一个会导致BT的设计比较冗余,第二个问题可以从设计上去尽量规避.
第二个需求是 对某个SubTree的 Switch In/Out 有不同的判断逻辑.
比如Actor发现目标后开始向目标发起追击,在追击途中可以会被障碍物卡住. 在设计DuringStuckAttack时候 期望的进入条件是
- 当前Actor在N秒内移动距离低于某个值
- 周围有可以被攻击的障碍物
- 距上次进入当前SubLogic的时间 > 某个值
这个Logic的退出条件是
- 在当前SubLogic已经持续了N秒
- 周围没有可被攻击的障碍物
这种嵌套的SubTreeLogic 似乎使用现有的BT设计方案 似乎可行, 不过会导致需要大量的冗余节点.
两款插件从设计里面上都是为了Codeless设计,就我个人认为BT应该更多应用于高层级的AI决策上,而对于LowLevel的Unity组件操作本就不应该放在Node里面.当然是针对有一定规模的项目来说.
所以两款插件各种花了呼哨的Node搞了一堆.其实对于正经项目开发来说意义不是很大.