using System.Collections; using System.Collections.Generic; using UnityEngine; using XNode; using System; using Sirenix.OdinInspector; using System.Linq; using ChivaXR; namespace ChivaVR.State { public class StateNode : Node { /// /// 进入触发条件 /// public enum EnterConditon { allFinish, anyFinish } [LabelText("Enter进入条件")] public EnterConditon enterConditon = EnterConditon.allFinish; public enum EnterState { 激活状态, 冻结状态 } [ReadOnly] public EnterState enterState = EnterState.冻结状态; [PropertyOrder(10)] [LabelText("监听nodes")] [ValueDropdown("GetAllProcessName",IsUniqueList = true)] public List listenStateNodes; public virtual bool IsRuning { get; set; } public virtual bool IsFinished { get; set; } public virtual bool IsTiShi { get; set; } /// /// State进入 /// public virtual void OnEnter() { enterState = EnterState.激活状态; IsRuning = true; } /// /// State离开 /// public virtual void OnExit() { enterState = EnterState.冻结状态; IsRuning = false; IsFinished = true; } public virtual void InitState() { enterState = EnterState.冻结状态; IsRuning = false; IsFinished = false; } [Serializable] public class Empty { } /// /// 输入端连接的Node是否完成 /// public bool CheckEnterConnectState() { NodePort enterNodePort = GetInputPort("enter"); bool tmpResult = true; foreach (var item in enterNodePort.GetConnections()) { StateNode node = item.node as StateNode; switch (enterConditon) { case EnterConditon.allFinish: if (!node.IsFinished) return false; break; case EnterConditon.anyFinish: if (node.IsFinished) return true; break; } } return tmpResult; } private IEnumerable GetAllProcessName() { for (int i = 0; i < ProcessManagement.Instance.processes.Count; i++) { yield return ProcessManagement.Instance.processes[i].processBase.GetPBDescribe(); } } } }