有时候,我们希望多个对象,使用同一个行为树。此时,不需要对每个对像重复配置一遍,而是提前将行为树保存为外部行为树(external tree),然后每个对象通过 Behavior Tree Refrence task 引用该外部行为树即可。
当原始行为树,执行到外部行为树时,会执行外部行为树中的所有 tasks。
如果原始行为树和外部行为树,拥有同名同类型的共享变量(SharedVariable),则以父行为树(原始行为树)为准。
通过重写 GetExternalBehaviors 方法,可实现根据运行时需求,返回相应的行为树。
一个原始行为树,可以同时引用多个外部行为树,此时可通过 BehaviorTreeRefrence task 为每个外部行为树指定变量值。
当需要在外部行为树之间切换时,可以使用一个缓存池,缓存外部行为树。使用的时候,取出行为树,赋值给行为树组件即可。示例代码:
using UnityEngine;
using BehaviorDesigner.Runtime;
public class ExternalPoolExample : MonoBehaviour {
public BehaviorTree behaviorTree;
public ExternalBehavior externalBehaviorTree;
private ExternalBehavior[] externalPool;
private int index;
public void Awake()
{
// Instantiate five External Behavior Tree which will be reused. The Init method will deserialize the External Behavior Tree.
externalPool = new ExternalBehavior[5];
for (int i = 0; i < externalPool.Length; ++i) {
externalPool[i] = Object.Instantiate(externalBehaviorTree);
externalPool[i].Init();
}
}
public void OnGUI()
{
// Assign the next External Behavior Tree within the simplified pool.
if (GUILayout.Button("Assign")) {
behaviorTree.DisableBehavior();
behaviorTree.ExternalBehavior = externalPool[index];
behaviorTree.EnableBehavior();
index = (index + 1) % externalPool.Length;
}
}
}