虚幻引擎 4 行为树的不同之处

该章节针对已熟悉 行为树 总体结构,希望快速在虚幻引擎 4 中迅速投入实际应用的读者。对于不熟悉行为树的读者而言,可能难以理解该章节中的部分解释。

较之于“标准”行为树,UE4 行为树的应用在三种关键方式上存在不同。

UE4 行为树为事件驱动型

事件驱动型 行为树可避免在每帧中执行大量工作。行为树并不会经常检查相关变化是否已经发生,它只会被动地等待在树中引起变化的“事件”。

事件驱动型结构对运行性能和除错大有帮助。如果希望获得这些帮助,必须理解虚幻引擎树的其他不同点,并正确搭建行为树结构。

代码在整个树的每个标记中无需迭代,因此运行性能将大大提升!从概念上而言,我们不需要不停地问“我们到了吗”,只需要轻松休息,会有人来告诉我们“到啦!”

在行为树执行日志中反复查看对行为进行纠错时,最佳的方法是让日志显示相关的变更,不显示无关的变更。在事件驱动型应用中,无需过滤出在树上迭代并选择之前相同行为的无关步骤,因为额外的迭代从开始便并未发生!只有树中执行位置或黑板数值发生的变化会产生影响,不同之处显而易见。

条件语句并非叶节点

在行为树标准模型中,条件语句为 Task 叶节点,除成功和失败外不执行任何操作。虽然也可以使用传统的条件 tasks,但还是强烈推荐您使用 Decorator 系统作为条件语句。

使用 decorators 而非 tasks 作为条件语句有多个明显优点。

首先,条件 decorators 使行为树 UI 显得更加直观易读。条件语句位于其所控制分支树的根部,因此一旦条件语句未被满足,便可直接看到树的哪个部分被“关闭”。此外,所有叶节点均为行动 tasks,因此更容易分辨树在对哪些实际行动下达命令。 在传统模型中,条件语句混于叶节点中,因此需要花更多时间分辨哪些叶节点是条件语句,哪些叶节点是行动。

decorator.png

在行为树的这个部分中,Decorators Close EnoughBlackboard 可阻止 Sequence 节点子项的执行。

条件 decorators 的另一个优点是可以简单地将 decorators 变为树中关键节点上的 observers(等待事件发生)。如要完全利用行为树事件驱动特性的优点,掌握该功能十分关键。

并发行为的特殊处理

标准行为树通常使用 Parallel composite 节点来处理并发行为。Parallel 节点同时执行其所有子项。在一个或多个子项树完成时,特殊规则将决定如何执行(取决于所需行为)。

Parallel 节点不是绝对的多线程(完全同步执行任务)。它们只是概念上一次执行多个任务的方式。它们经常在同一线程上运行,并在一些序列中开始。该序列应为不相关,因为它们全部在同一框架中发生。但有时它也很重要。

UE4 行为树抛弃了复杂 Parallel 节点,使用 Simple Parallel 节点和称为 Services 的特殊节点,以实现同类行为。

为什么不使用 Parallel 节点?

  1. 即便相对简单行为而言,Parallel 节点也会让人迷惑。

    实际上 Parallel 节点同时运行一群单独的分支树,但如果其中一个失败,其中或所有分支树都会中止,它们也可能在其他分支树完成时(结果为成功或失败)成功。在简单实例中,平行行为都会让人迷惑;尤其是它存在大量潜在可用选项,这会让使用者迷失方向。

  2. Parallel 节点不利于优化性能,尤其在构建事件驱动型树方面。

放弃了 Parallel 节点,UE4 使用的是什么?

有三种节点将提供平行节点的功能:

Simple Parallel 节点

Simple Parallel 节点只允许两个子项的存在:一个必为单独任务节点(含可选 decorators)、另一个为一个完整的分支树。

可以将 Simple Parallel 节点理解为:“执行 A 的同时也执行 B。”举例而言:“在攻击敌人时向敌人移动。”基本上来说,A 是主要任务,而 B 是等待 A 完成时执行的次要或补充任务。

有一些选项可以处理同时进行的次要任务(任务 B)。较之于传统 Parallel 节点,该节点在概念上还是相对简单。然而,它支持 Parallel 节点的多数常规用法。

可利用 Simple Parallel 节点简便地进行一些事件驱动型优化。而 Full Parallel 节点的优化则要复杂许多。

Services

Services 是与 composite 节点(Selector、Sequence、或 Simple Parallel)相关的特殊节点。它能在每 X 秒注册回呼并执行多个定期发生类型的更新。

举例而言,service 能用于确定哪名敌人是 AI Pawn 的最佳追逐目标;与此同时,Pawn 在其行为树中继续正常追踪当前敌人。

只有执行仍然处于以 composite 节点(与 service 相关)为根的分支树中时,Services 方为有效。

Decorator “Observer Aborts” 属性

标准 Parallel 节点的一个常见用途是不断对条件进行检查,以便在条件无法达成时中止任务。举例而言,有一只猫执行序列,如“摇屁股”或“猛扑”,在老鼠已经逃进洞后,直接放弃任务。如使用 Parallel 节点,有一个子项将检查猫是否可以扑到老鼠,另一子项就是要执行的序列。因为 UE4 行为树是事件驱动型,条件 decorators 将观察数值,并在需要时中止任务。(在该例中,只需要在序列上添加“老鼠是否能被扑到” decorator,然后将 “Observer Aborts” 设为 “Self”。)

UE4 处理并发行为的优点

清晰明了

使用 Services 和 Simple Parallel 节点可创建出易于理解的简单行为树。

便于纠错

图表更清晰,便于纠错。除此之外,更少的同时执行路径十分便于观察图表中实际发生的状况。

优化简单

如没有较多同时执行的分支树,事件驱动型图表将更易于优化。

常见问题

“能实现 Parallel 节点的所有功能吗?”

  • 我们提供的节点可以帮您实现必要的功能,而且界面更加简单便捷。以上节点只是用于通常情况。如果发现一些不常见情况无法处理或效果不理想,我们将考虑对此进行修复。

“这些就是 UE4 行为树和‘标准’行为树的全部不同点吗?”

  • 这里的“标准”只是一个特定称谓而已。因为它本身并无严格意义上的“标准”一说,所以在 UE4 和您所熟悉的行为树之间可能存在数量不同的差异。如您所熟悉的是不常见的行为树,则可能存在较大差异。无论如何,细微差异均难以避免。希望这些要点能帮助您了解最重要的差异,以便正确构建您的行为树。如需了解 UE4 特殊节点的更多详情,请阅读其的相关章节。