using SampleBehavirTree; using System; using System.Collections; using System.Collections.Generic; using UnityEditor; using UnityEngine; public class SampleBehaviourTree : MonoBehaviour { private BehaviourNode root; private List behaviourNodes = new List(); // Start is called before the first frame update void Start() { BehaviourCtrl.Init(); behaviourNodes = CreatBehaviorNodes(AISys.Instance._workerNum); } // Update is called once per frame void Update() { ExcuteBehaviourNodes(behaviourNodes); } [ContextMenu("执行行为树")] void ExcuteBehaviour() { StartCoroutine(c_ExcuteBehaviour()); } void ExcuteBehaviourNodes(List nodes) { StartCoroutine(c_ExcuteBehaviour(nodes)); } IEnumerator c_ExcuteBehaviour() { yield return StartCoroutine(root.Execute()); } IEnumerator c_ExcuteBehaviour(List nodes) { for (int i = 0; i < nodes.Count; i++) { yield return StartCoroutine(nodes[i].Execute()); } } public BehaviourNode CreatBehaviour() { var selector = new Selector(); var sequence_1 = new Sequence(); var condition1 = new condition_Behavir(); var action1 = new DebugTest(); action1.info = "测试行为树"; //添加条件 sequence_1.nodes.Add(condition1); //添加行为 sequence_1.nodes.Add(action1); // selector.nodes.Add(sequence_1); //不同类别Action 的参数配置 return selector; } public List CreatBehaviorNodes(int num) { List nodeList = new List(); for (int i = 0; i < num; i++) { var selector = new Selector(); selector.ID = i; var sequence_1 = new Sequence(); var sequence_2 = new Sequence(); var sequence_3 = new Sequence(); var sequence_4 = new Sequence(); var condition1 = new AI_WorkerWorkState(); var condition2 = new AI_WorkerMoveState(); var condition3 = new AI_WorkerDieState(); var condition4 = new AI_WorkerCheckState(); condition1._Worker = AISys.Instance._workerGroup[i]; condition2._Worker = AISys.Instance._workerGroup[i]; condition3._Worker = AISys.Instance._workerGroup[i]; condition4._Worker = AISys.Instance._workerGroup[i]; var action1 = new WorkAction(); var action2 = new MoveAction(); var action3 = new DieAction(); var action4 = new CheckAction(); action1._Worker = condition1._Worker; action2._Worker = condition2._Worker; action3._Worker = condition3._Worker; action4._Worker = condition4._Worker; //1号分支 sequence_1.nodes.Add(condition1); sequence_1.nodes.Add(action1); //2号分支 sequence_2.nodes.Add(condition2); sequence_2.nodes.Add(action2); //3号分支 sequence_3.nodes.Add(condition3); sequence_3.nodes.Add(action3); //4号分支 sequence_4.nodes.Add(condition4); sequence_4.nodes.Add(action4); selector.nodes.Add(sequence_1); selector.nodes.Add(sequence_2); selector.nodes.Add(sequence_3); selector.nodes.Add(sequence_4); nodeList.Add(selector); } return nodeList; } }