《光环3》行为树AI的进化

Posted on Jul 8, 2020

halo 3

这是2007年游戏开发者大会(GDC ‘07)上的一篇演讲,Bungie Studios 的 Max Dyckhoff 介绍了从《光环2》到《光环3》,开发团队对其行为树 AI 系统所做的改进。

Stimulus Behaviors

问题: 在行为树每次更新时,很少触发的事件驱动行为也会检查。在一定程度上引起了不必要的性能消耗。

Halo 2: 将行为或冲动以动态或异步的方式添加到行为树的指定位置。

“Halo 2: Stimulus Behaviors”

新问题: Stimulus Behavior 增加了行为树的复杂度,使得调试更加困难,实现也更加棘手。

Halo 3: 删减 Stimulus Behavior 功能,取而代之的是 _ “刺激激活(Stimulus Activation)” _ 的概念。当特定事件发生时,不必动态插入新行为,而是激活已经在行为树中预先定义好的行为。

“Halo 3: Stimulus Activation”

CHILD_ENTRY( <behaviour_name>, CHECK_STIMULUS( <stimulus_name>))

通过这种方式,行为树的结构保持静态不变,避免了动态插入带来的复杂性,同时通过刺激机制实现了相同的响应特定事件的功能。

Behavior Masks

问题: 在某项情况下,能够行为树移除指定的行为。 Halo 2: 使用 ”风格(Style)“。可以给每个角色设置一种风格,设计师可以根据自己的需求来定制行为树中的行为。

新问题:

  • Styles 机制给了设计师过高的自由度,导致行为树的复杂性增加且缺乏规范性,设计师无法透彻地理解整个行为树。
  • Styles 带来的行为调整过于细微和主观,难以被玩家所感知。

Halo 3: 使用 ”态度(Attitude)“ 概念替代自由度过高的 ”风格(Style)“。比如 预设 ”胆小的“、”普通的“、”好斗的“ 不同态度,根据态度调整行为参数。

引入 ”抑制(Inhibition)“ 的概念来实现行为的自定义。

“Halo 3: Inhibitions”

BEHAVIOUR( <behaviour_name>, INHIBIT( <inhibition_name> | <inhibition_name_2>))

Maintaining Knowledge

Halo 2: 整理 AI 的知识,区分适合和不适合存储在行为树的数据。

  • 对目标的搜索状态 是持久性数据
  • AI角色的载具状态 是临时性数据。

新问题: 载具状态是临时的,导致行为被打断时,AI 会忘记载具状态,同时也难以和其它角色协作。

Halo 3: 引入新概念:”载具(vehicle)“

  • 载具(vehicle) 的数据结构存储在 Actor 上
  • 使用专门的”连接“和”分离“冲动来控制载具状态的变化
  • 添加"进入"和"离开"载具的行为

优点:

  • 提高了系统的健壮性
  • 提高了设计师的控制力
  • 改善了与游戏脚本的集成

其它改进

Joint Behaviors

针对 AI 需要协作的问题,Halo 2 的解决办法是分发邀请给其它 Actor,邀请其参与 联合行为 (Joint Behavior) 。而 Halo 3 采用多重机制,引入新概念如”载具“和更高层的协作等,结合刺激行为实现了战斗过程中相互协调、配合的行为等等;

Arguments to Behaviors

  • 为正在运行的行为增加一些上下文。以”掩护“为例,增加”掩护“的原因。
  • 重用行为。在战斗后可以跳转到某些行为。

Impulses for Control

  • 经常用 ”冲动(impulse)“ 控制角色的各个方面。比如,进入狂暴状态,开启光学迷彩,控制移动速度等等。结合 Behavior Masks,使得 ”冲动(impulse)“ 的功能非常强大。

总结

以前使用是一棵动态的行为树结构,现在则是一个通过大量"掩码"机制来控制的静态结构。同时也将一些概念移出了行为树,在保持设计灵活性和系统可维护性的同时,简化了系统结构。