using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Events; //流程中步骤节点控制基类 管理所有的前置和后置步骤 定义步骤激活和步骤完成行为 public abstract class StepNodeBase : MonoBehaviour { protected ProcessEnum currentProcess;//流程名称 [SerializeField] protected bool autoFinishedStep;//激活时自动完成的步骤 [SerializeField] string nodeName; /// /// 节点名称 /// public string NodeName { get { return nodeName; } } //[HideInInspector] //节点完成情况 public NodeFinishState stepState; public NodeFinishState StepState { get { return stepState; } } //当前节点激活状态 避免重复激活 protected NodeActiceState nodeActiceState; public NodeActiceState NodeActiceState { get { return nodeActiceState; } } /// /// 前置节点 所有的前置节点满足后 启动本节点 /// public List preconditionNodes = new List(); /// /// 后置节点 本节点完成后 通知后置节点 /// public List postpositionNodes = new List(); public event UnityAction NodeFinished;//步骤完成 // Start is called before the first frame update protected virtual void Awake() { ProcessManager.Instance.AddStep(this);//将操作物体加入当前流程控制器 } /// /// 前置节点通知完成时 /// public void PreNodeFinished(StepNodeBase stepNode = null) { bool hasPNunFinised = false; for (int i = 0; i < preconditionNodes.Count; i++) { if (preconditionNodes[i].StepState == NodeFinishState.unFinished) { hasPNunFinised = true; break; } } if (!hasPNunFinised)//前置节点都完成了 或者没有前置节点 { stepState = NodeFinishState.unFinished; Active(); Debug.Log($"{currentProcess}流程,前置条件均满足,{nodeName}激活"); } } /// /// 开始前先设置 流程 避免某些节点激活时自动完成 导致后续流程异常 /// /// public void SetProcess(ProcessEnum processEnum) { currentProcess = processEnum; } /// /// 流程开始时执行 /// /// public void ProcessStart() { stepState = NodeFinishState.unFinished;//开始时默认所有的 步骤均为完成 if (preconditionNodes.Count == 0)//无前置节点流程开始时 直接激活 { //Debug.Log($"{currentProcess}流程开始时{nodeName}激活"); Active(); } } //流程结束时 public void ProcessStop() { UnActive(); } /// /// 节点激活时执行 /// protected abstract void Active(); /// /// 退出激活状态时执行 /// protected abstract void UnActive(); /// /// 节点行为完成 退出激活状态 通知后续节点 由节点行为结束时调用 /// protected virtual void NodeFinised() { Debug.Log(NodeName + "步骤完成"); stepState = NodeFinishState.finished; UnActive(); NodeFinished?.Invoke();//节点完成事件 通知外部的事件 ProcessManager.Instance.RecordFinisedStep(NodeName);//通知管理器本节点完成 //尝试启动后续节点 for (int i = 0; i < postpositionNodes.Count; i++) { postpositionNodes[i].PreNodeFinished(this); } } } //节点完成状态 public enum NodeFinishState { /// /// 已完成 /// finished, /// /// 未完成 /// unFinished, } /// /// 节点激活状态 /// public enum NodeActiceState { /// /// 已激活状态 /// active, /// /// 未激活状态 /// unActice, }