没有标题

PS:该篇文章主要记录了behaviac和behavior的区别,如果没有兴趣可跳过。
想了解behaviac可转至:【Behaviac与Unity整合使用】
想了解behavior designer可转至:

行为树技术已经在游戏开发过程中逐渐变得流行起来。目前业界有两款知名
度相对比较高的行为树组件——Behavior Designer(后面简称 BD)和 behaviac。本文将重点剖析这两款行为树组件的特点和差异。

BD 是独立游戏工作室 Opsive 开发的一款集成在 Unity 引擎中的行为树插件(www.opsive.com),提供了让程序员、策划、美术等方便使用的可视化编辑器,以及丰富的 API 以便轻松的创建任务,并无缝集成类似 uScript 和 PlayMaker 等第三方的 Unity 插件。
behaviac 是腾讯公司提供的一款行为树解决方案(www.behaviac.com),是游戏 AI 的开发框架和组件。支持全平台,适用于客户端和服务器,助力游戏快速迭代开发,提供了功能强大的编辑器和 API。

费用
BD 是 Unity Asset Store 中的付费组件,可以拿到运行时的源码,如下图所示:
在这里插入图片描述
behaviac 完全免费使用, 已经在 Github 上全部开源,包括运行时和编辑器。

平台
BD 是 Unity 引擎的插件,运行时只有 C#语言实现,编辑器也整合在 Unity 的编辑器中。
behaviac 的运行时支持全平台(Windows/Android/iOS/Linux 等),有 C++和 C#两种版本,并原生支持 Unity 引擎,也可以整合 Cocos 引擎。编辑器运行在 Windows 上,是独立运行的exe,可以通过 IP 和端口跟游戏端(运行时)进行本机或远程连调。

支持
BD 可以在其官网提供的论坛进行发帖咨询并得到答疑,提供了较为全面的文档、视频和示例,但目前只有全英文版。
behaviac 在官网和 Github 上提供了问题咨询和答疑,目前都为全中文版。此外,还提供了开发者 QQ 群(433547396),可以与组件研发人员进行实时沟通,以最快的速度交流使用中的问题,并及时修复使用者发现的 bug。behaviac 自带了相关游戏 demo 和单元测试的代码,提供的中文文档已经较为全面,但缺乏教学视频。

技术点
相比其他行为树组件,BD 提供了很多实用的技术:还是比较丰富的,同时还可以自己拓展节点

节点类型
BD 提供了四种概念节点,都称之为任务(Task):
组合节点(Composite):Sequence、Selector、Parallel 等。
装饰节点(Decorator):为仅有的一个子节点额外添加一些功能,比如让子节点一直运行直到其返回某个运行状态值,或者将子节点的返回值取反等。
动作节点(Action):动作节点是真正做事的节点,其为叶节点。BD 中自带了很多动作节点,如果不够用,也可以编写自己的动作节点。
条件节点(Conditional):用于判断某条件是否成立。

BD 常用的任务包括动作和条件节点,这两个节点是用来派生出自己游戏所需的子类来进行脚本定制,特定的逻辑体现在派生出的动作或条件节点中,暴露一些属性在编辑器中以供配置和测试。
BD 提供了覆盖整个 Unity 引擎 API 的各种任务,包括动画、声音、物理、角色控制、粒子系统等方面的常用类型(如下图所示),这样就允许非程序员(策划或美术)方便的创建自己的游戏 AI,同时也让程序员尽量少的编写自定义的任务。
在这里插入图片描述
behaviac 提供了丰富的节点类型,一般情况下,开发者无需扩展自己的节点就可以工作,并不需要派生自己的动作和条件节点。除了支持常用的节点外,behaviac 还提供了很多快捷节点(例如,选择监控、条件执行、概率选择、随机选择等),每个节点上还可以支持添加附件(前置、后置和事件等)。

此外,behaviac 还提供了有限状态机(FSM),并支持 FSM 跟行为树的嵌套使用。behaviac 是基于元信息的工作方式,只需要实现 Agent 子类及其属性、方法,然后在编辑器中创建行为树时选用这些属性或方法。

条件终止
BD 为了实现终止执行,引入了条件终止(Conditional Abort)的概念,也就是设置了终止的节点将在每次更新时都会进行条件测试,以免从头开始执行整个行为树。这类似于虚幻引擎 4(UE4)中的观察者终止(Observer Abort)。
如下图所示,Sequence 节点设置了“Abort”标记,那么当第一个叶子节点“Int Comparison”返回为 true 时,可以执行到后面的 Wait 节点。这里 Wait 节点会等待 10 秒中,在这 10 秒内如果之前的“Int Comparison”节点返回为 false 时,那么 Sequence 节点会被重新开始执行。
在这里插入图片描述
behaviac 的实现方式跟 BD 有所区别,可以通过“前置”附件来实现该功能。该前置附件的“执行时机”只要设置为“Enter/Update”,就可以支持当前节点在每次进入或执行时都会检测该前置条件,来决定它的子节点是否会被执行。
behaviac 的前置附件机制可能更为灵活和通用,接下来介绍的节点类型也能通过前置来实现。

中断节点
BD 提供了中断(Interrupt)和执行中断(Perform Interruption)节点。
如果中断节点被触发,则它的所有子节点的执行被中断。中断命令被执行中断节点发起。中断节点在收到中断命令前,不会打断子节点的执行状态。如果子节点执行完毕还没有收到任何中断命令,则直接返回子节点的执行结果,如下图所示:
在这里插入图片描述
behaviac 没有提供中断相关的节点,可以通过“前置”附件来实现该功能。该前置附件的“执行时机”只要设置为“Enter/Update”,就可以支持当前节点在每次进入或执行时都会检测该前置条件,来决定它的子节点是否会被执行。

监控节点
BD 提供了监控任务(Guard Task)来保证多个节点执行的互斥性,类似于多线程编程中的信号量(Semaphore)。
比如有两个不同的任务,一个播放声音,另一个播放特效。这两个任务在行为树里是两个不同的分支,所以它们之间并不知道对方的状态,有可能同一时间这两个任务被同时执行。
但可能并不希望这种情况发生。在这种情况下,通过使用监控任务来保证当前要么播放音效,要么播放特效。只有当第一个播放完毕,才会播放第二个。
behaviac 没有提供监控节点,可以通过“前置”附件来实现该功能。该前置附件的“执行时机”只要设置为“Enter/Update”,就可以支持当前节点在每次进入或执行时都会检测该前置条件,来决定它的子节点是否会被执行。

事件系统
BD 提供了一个内置的事件系统,可以通过代码(BehaviorTree.SendEvent 函数)触发事件,也可以通过行为树的节点来触发(SendEvent 节点)和监听(HasReceivedEvent 节点)事件。
behaviac 的事件跟 BD 有所区别,通过附件的方式,将另一棵行为树作为附件添加到当前行为树的某个节点上,在游戏端(运行时)发送事件时进行响应,并切换到另一棵行为树。
behaviac 未提供 BD 中的 SendEvent 和 HasRecivedEvent 节点,只能在代码端发送事件,行为树里监听和响应事件。

性能
BD 和 behaviac 都存在着部分代码使用了 C#的反射来进行方法的调用,会影响性能。
在 BD 中,行为树在启动的时候会获取每个任务的事件接口。事件定义在了Behavior.EventTypes 里,包括 OnCollisionEnter 和 Update 等物理和更新事件。获取事件的时候由于用到了 C#的反射,所以当任务节点很多的时候,这个过程会非常的慢。
在 behaviac 中,解决方案是通过生成 C#源码的方式来绕开反射的使用,目前 XML 版行为树的执行还依赖于反射,需要改进。

热更新
BD 的行为树的扩展节点全部基于 C#写脚本实现,不便于在 iOS 平台进行热更新。
behaviac 采用 XML 版的行为树,这些 XML 文件可以作为配置文件在 iOS 平台上进行热更新。

调试
BD 的编辑器嵌套在 Unity 编辑器中,调试可以无需跟游戏建立连接,就可以直接设置断点、查看执行路径、修改变量进行调试。
而 behaviac 的编辑器是独立的 exe。当进行调试时,需要将游戏端(运行时)跟编辑器建立连接,然后游戏端将数据发到编辑器,编辑器进行相应的显示,编辑器这边也可以修改参数并发送给游戏端进行测试。
behaviac 独立的编辑器可以方便的与布局在 Linux 服务器上的游戏端进行远程连调,这也是 BD 所不支持的优势。

编辑与查看 在编辑行为树的过程中,通过实时的错误检测器,BD 会立即显示行为树中的节点错误,这样方便开发者快速找出错误而不用等到运行时。类似的,如果修改了行为树,BD 会在游戏场景中立即使用修改后的行为树。 behaviac 对行为树错误的检测是通过在编辑器中手动的点击“检查错误”按钮或开始导出行为树时,才开始检查行为树中的错误。此外,如果修改了行为树,也需要手动导出该行为树后,通过热加载,游戏端才会自动体现修改后的效果。 因此,behaviac 在实时编辑和检查错误方面,可以稍微改进跟 BD 保持一致流畅的用户体验。