有时候,我们希望多个对象,使用同一个行为树。此时,不需要对每个对像重复配置一遍,而是提前将行为树保存为外部行为树(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;}}}
