有时候,我们希望多个对象,使用同一个行为树。此时,不需要对每个对像重复配置一遍,而是提前将行为树保存为外部行为树(external tree),然后每个对象通过 Behavior Tree Refrence task 引用该外部行为树即可。

    当原始行为树,执行到外部行为树时,会执行外部行为树中的所有 tasks。

    如果原始行为树和外部行为树,拥有同名同类型的共享变量(SharedVariable),则以父行为树(原始行为树)为准。

    通过重写 GetExternalBehaviors 方法,可实现根据运行时需求,返回相应的行为树。

    一个原始行为树,可以同时引用多个外部行为树,此时可通过 BehaviorTreeRefrence task 为每个外部行为树指定变量值。

    当需要在外部行为树之间切换时,可以使用一个缓存池,缓存外部行为树。使用的时候,取出行为树,赋值给行为树组件即可。示例代码:

    1. using UnityEngine;
    2. using BehaviorDesigner.Runtime;
    3. public class ExternalPoolExample : MonoBehaviour {
    4. public BehaviorTree behaviorTree;
    5. public ExternalBehavior externalBehaviorTree;
    6. private ExternalBehavior[] externalPool;
    7. private int index;
    8. public void Awake()
    9. {
    10. // Instantiate five External Behavior Tree which will be reused. The Init method will deserialize the External Behavior Tree.
    11. externalPool = new ExternalBehavior[5];
    12. for (int i = 0; i < externalPool.Length; ++i) {
    13. externalPool[i] = Object.Instantiate(externalBehaviorTree);
    14. externalPool[i].Init();
    15. }
    16. }
    17. public void OnGUI()
    18. {
    19. // Assign the next External Behavior Tree within the simplified pool.
    20. if (GUILayout.Button("Assign")) {
    21. behaviorTree.DisableBehavior();
    22. behaviorTree.ExternalBehavior = externalPool[index];
    23. behaviorTree.EnableBehavior();
    24. index = (index + 1) % externalPool.Length;
    25. }
    26. }
    27. }