• 行为树优点:tasks 之间是松耦合的,一个 task 的执行不依赖其他 task
  • 行为树缺点:tasks 之间有时候需要共享一些信息

传统的行为树中,使用一个 blackboard 来保存需要共享的信息。Behavior Designer 则使用共享变量(Shared Variables),要简单很多。

变量类型

  • 全局变量 Global Variables:所有行为树共用
  • 本地变量 Local Variables

    • 共享变量 Shared Variables:当前行为树共用
    • 动态变量 Dynamic Variables:多个 tasks 共用

      01 共享变量 Shared Variables

      image.png
      如上图的例子:
  • Within Sight:是否有 target 在视野内

    • 如果有,需要缓存 target 变量
  • Move Towards:前往 target
    • 需要用到 Within Sight 中缓存的 target 变量

想要实现上面的需求,需要在 Within Sight 和 Move Towards 的实现代码中,分别添加一个相同的共享变量:

  1. public SharedTransform target;

此时选中 Within Sight 或 Move Towards 的 task,会发现 Inspector 窗口中出现了该变量(约定称为:公开变量),如图(忽略下拉框中已经配置好的 Target,后面会介绍):
image.png
然后在 Behavior Designer 的 Variables 窗口中,配置 Name 和 Type 参数,点击 Add 创建一个 Target 共享变量,如图:
image.png
然后在 Within Sight 和 Move Towards 的 Inspector 窗口中,将 target 和上一步创建的 Target 绑定,如图:
image.png
上述步骤完成后,我们就可以在 Within Sight 和 Move Towards 的代码中使用这个共享变量:

  1. Transform transformValue = target.Value;

02 变量映射 Variables Mappings

上面的例子中,共享变量 Target 的值,由我们自己写的代码进行读写更新。而有些时候,有些特定的变量,可以通过变量映射的方式,被动更新(自动更新,或其他脚本负责更新)。

假设我们创建了一个 Position 共享变量,并希望它的值就是 Agent 的 postion 值,则可以在 Variables 窗口中,点击共享变量右边的小三角按钮,然后会出现一些可绑定的同类型的变量。本例中绑定的是 Agent 的 position,如下图:
image.png
上述步骤完成后,对共享变量 Position 的读写,等价于对 Agent 的 position 变量的读写。

不使用变量映射,而是使用一个单独的 task,也能够获取 Agent 的 position,但是比较麻烦,而且降低了行为树的可读性。使用变量映射,就方便优雅很多。

上图中显示的是内置的映射属性,我们也可以创建自己的映射属性。

03 内置共享变量类型

  • SharedAnimationCurve
  • SharedBool
  • SharedColor
  • SharedFloat
  • SharedGameObject
  • SharedGameObjectList
  • SharedInt
  • SharedMaterial
  • SharedObject
  • SharedObjectList
  • SharedQuaternion
  • SharedRect
  • SharedString
  • SharedTransform
  • SharedTransformList
  • SharedVector2
  • SharedVector3Int
  • SharedVector3
  • SharedVector3Int
  • SharedVector4