RunStateNode.cs 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using XNode;
  5. using System;
  6. using Sirenix.OdinInspector;
  7. using System.Linq;
  8. using ChivaXR;
  9. namespace ChivaVR.State
  10. {
  11. /// <summary>
  12. /// 运行状态
  13. /// </summary>
  14. public class RunStateNode : StateNode
  15. {
  16. [Input, HideInInspector] public Empty enter;
  17. [Output, HideInInspector] public Empty exit;
  18. [ValueDropdown("GetProcedure", IsUniqueList = true)]
  19. [OnValueChanged("ResetCurrentProcedure")]
  20. [HideLabel]
  21. public int currentProcedureStepID;
  22. [ReadOnly]
  23. public string currentProcedureDescription;
  24. private static IEnumerable GetProcedure()
  25. {
  26. return ProcessManagement.Instance.processes.Select(x => new ValueDropdownItem(x.processBase.GetPBDescribe(), x.stepID));
  27. }
  28. private ProcessElement currentProcedure;
  29. public ProcessElement CurrentProcedure
  30. {
  31. get
  32. {
  33. if (currentProcedure == null)
  34. {
  35. currentProcedure = GetCurrentProcedureByDescription();
  36. }
  37. return currentProcedure;
  38. }
  39. }
  40. public void ResetCurrentProcedure()
  41. {
  42. currentProcedure = GetCurrentProcedureByStepID();
  43. currentProcedureDescription = currentProcedure.processBase.GetPBDescribe();
  44. }
  45. public void UpdataCurrentProcedureDescription()
  46. {
  47. if (currentProcedure == null) return;
  48. currentProcedureDescription = currentProcedure.processBase.GetPBDescribe();
  49. }
  50. /// <summary>
  51. /// 获取当前流程
  52. /// </summary>
  53. /// <returns></returns>
  54. public ProcessElement GetCurrentProcedureByStepID()
  55. {
  56. if (currentProcedureStepID == 0) return null;
  57. if (ProcessManagement.Instance.processes.Where(x => (x.stepID.Equals(currentProcedureStepID))).Count() == 0)
  58. {
  59. GetCurrentProcedureByDescription();
  60. return null;
  61. }
  62. return ProcessManagement.Instance.processes.Where(x => (x.stepID.Equals(currentProcedureStepID))).First();
  63. }
  64. /// <summary>
  65. /// 获取当前流程
  66. /// </summary>
  67. /// <returns></returns>
  68. public ProcessElement GetCurrentProcedureByDescription()
  69. {
  70. if (ProcessManagement.Instance.processes.Where(x => (x.processBase.GetPBDescribe().Equals(currentProcedureDescription))).Count() == 0)
  71. {
  72. currentProcedureDescription = "未找到对应Procedure";
  73. return null;
  74. }
  75. return ProcessManagement.Instance.processes.Where(x => (x.processBase.GetPBDescribe().Equals(currentProcedureDescription))).First();
  76. }
  77. public override bool IsRuning { get => base.IsRuning; set => base.IsRuning = value; }
  78. public override bool IsFinished
  79. {
  80. get
  81. {
  82. if (CurrentProcedure != null)
  83. {
  84. return CurrentProcedure.finished;
  85. }
  86. return false;
  87. }
  88. }
  89. public override bool IsTiShi { get => base.IsTiShi; set => base.IsTiShi = value; }
  90. StateGraph stateGraph;
  91. [LabelText("分数:")]
  92. public int score = 1;
  93. public override void OnEnter()
  94. {
  95. base.OnEnter();
  96. stateGraph = graph as StateGraph;
  97. NodePort enterPort = GetInputPort("enter");
  98. if (enterPort.GetConnections().Count == 0) return;
  99. for (int i = 0; i < enterPort.GetConnections().Count; i++)
  100. {
  101. StateNode node = enterPort.GetConnection(i).node as StateNode;
  102. if (!node.IsFinished) return;
  103. }
  104. IsRuning = true;
  105. CurrentProcedure.SetEnterState(true);
  106. CurrentProcedure.Enter();
  107. CurrentProcedure.processElementExitHandle += FinishedProcedure;
  108. }
  109. /// <summary>
  110. /// 1.清空启用节点池
  111. /// 2.得到最新开启的节点存到池中
  112. /// </summary>
  113. public override void OnExit()
  114. {
  115. base.OnExit();
  116. stateGraph.OnNodeExitState(this);
  117. NodePort exitPort = GetOutputPort("exit");
  118. if (IsFinished && !IsTiShi)
  119. {
  120. //StudentExamManager.Instance.currentExammingStudentInfo.totleScore += score;
  121. }
  122. if (!exitPort.IsConnected)
  123. {
  124. Debug.LogWarning("Node isn't connected");
  125. return;
  126. }
  127. for (int i = 0; i < exitPort.GetConnections().Count; i++)
  128. {
  129. StateNode node = exitPort.GetConnection(i).node as StateNode;
  130. node.OnEnter();
  131. }
  132. }
  133. public void FindListenNodeState()
  134. {
  135. StateGraph StateGraph = ProcessManagement.Instance.stateGraph;
  136. List<StateNode> stateNodes = new List<StateNode>();
  137. foreach (var item in listenStateNodes)
  138. {
  139. }
  140. }
  141. public void FinishedProcedure(ProcessElement currentProcess)
  142. {
  143. Debug.Log("完成" + currentProcedure.name);
  144. currentProcess.processElementExitHandle -= FinishedProcedure;
  145. OnExit();
  146. }
  147. /// <summary>
  148. /// 获取本节点前没有完成的Nodes
  149. /// </summary>
  150. /// <param name="runNode"></param>
  151. /// <returns></returns>
  152. public List<RunStateNode> GetEnterPortNoFinishedNode()
  153. {
  154. return ErgodicEnterPortNoFinishedNodes(this);
  155. }
  156. /// <summary>
  157. /// 遍历输入节点的所有没有完成的Nodes
  158. /// </summary>
  159. public List<RunStateNode> ErgodicEnterPortNoFinishedNodes(RunStateNode runNode)
  160. {
  161. List<RunStateNode> stateNodes = new List<RunStateNode>();
  162. NodePort enterPort = runNode.GetInputPort("enter");
  163. foreach (NodePort item in enterPort.GetConnections())
  164. {
  165. StateNode node = item.node as StateNode;
  166. if (!node.IsFinished)
  167. {
  168. stateNodes.Add(node as RunStateNode);
  169. ErgodicEnterPortNoFinishedNodes(node as RunStateNode);
  170. }
  171. else
  172. {
  173. continue;
  174. }
  175. }
  176. return stateNodes;
  177. }
  178. }
  179. }