- 行为树优点:tasks 之间是松耦合的,一个 task 的执行不依赖其他 task
- 行为树缺点:tasks 之间有时候需要共享一些信息
传统的行为树中,使用一个 blackboard 来保存需要共享的信息。Behavior Designer 则使用共享变量(Shared Variables),要简单很多。
变量类型
- 全局变量 Global Variables:所有行为树共用
本地变量 Local Variables
Within Sight:是否有 target 在视野内
- 如果有,需要缓存 target 变量
- Move Towards:前往 target
- 需要用到 Within Sight 中缓存的 target 变量
想要实现上面的需求,需要在 Within Sight 和 Move Towards 的实现代码中,分别添加一个相同的共享变量:
public SharedTransform target;
此时选中 Within Sight 或 Move Towards 的 task,会发现 Inspector 窗口中出现了该变量(约定称为:公开变量),如图(忽略下拉框中已经配置好的 Target,后面会介绍):
然后在 Behavior Designer 的 Variables 窗口中,配置 Name 和 Type 参数,点击 Add 创建一个 Target 共享变量,如图:
然后在 Within Sight 和 Move Towards 的 Inspector 窗口中,将 target 和上一步创建的 Target 绑定,如图:
上述步骤完成后,我们就可以在 Within Sight 和 Move Towards 的代码中使用这个共享变量:
Transform transformValue = target.Value;
02 变量映射 Variables Mappings
上面的例子中,共享变量 Target 的值,由我们自己写的代码进行读写更新。而有些时候,有些特定的变量,可以通过变量映射的方式,被动更新(自动更新,或其他脚本负责更新)。
假设我们创建了一个 Position 共享变量,并希望它的值就是 Agent 的 postion 值,则可以在 Variables 窗口中,点击共享变量右边的小三角按钮,然后会出现一些可绑定的同类型的变量。本例中绑定的是 Agent 的 position,如下图:
上述步骤完成后,对共享变量 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