ProcessElement.cs 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. namespace ChivaXR
  2. {
  3. using UnityEngine;
  4. using Sirenix.OdinInspector;
  5. /// <summary>
  6. /// 步骤跳转状态(步骤跳转时依据当前ProcessElement物体查找接口组件并执行)
  7. /// </summary>
  8. public interface IProcessState
  9. {
  10. /// <summary>
  11. /// 步骤初始状态
  12. /// </summary>
  13. /// <param name="enterCurrent">true:进入当前状态--false:向前跳步</param>
  14. void EnterState(bool enterCurrent);
  15. /// <summary>
  16. /// 步骤结束状态
  17. /// </summary>
  18. void ExitState();
  19. void HalfQuit();
  20. }
  21. /// <summary>
  22. /// 步骤组件
  23. /// </summary>
  24. public class ProcessElement : MonoBehaviour
  25. {
  26. /// <summary>
  27. /// 当前步骤StepID
  28. /// </summary>
  29. public int stepID;
  30. /// <summary>
  31. /// 当前步骤是否激活
  32. /// </summary>
  33. public bool active;
  34. /// <summary>
  35. /// 当前步骤完成情况
  36. /// </summary>
  37. public bool finished;
  38. /// <summary>
  39. /// 操作前预处理逻辑
  40. /// </summary>
  41. [HideInInspector]
  42. public PreprocessBase preprocess;
  43. /// <summary>
  44. /// 操作类基类
  45. /// </summary>
  46. public ProcessBase processBase;
  47. public System.Action<ProcessElement> processElementEnterHandler;
  48. public System.Action<ProcessElement> processElementTriggerHandler;
  49. public System.Action<ProcessElement> processElementExitHandle;
  50. /// <summary>
  51. /// 流程使用状态
  52. /// </summary>
  53. /// <param name="state"></param>
  54. public void SetProcessActive(bool state)
  55. {
  56. active = state;
  57. }
  58. /// <summary>
  59. /// 进入当前步骤
  60. /// </summary>
  61. public void Enter()
  62. {
  63. SetProcessActive(true);
  64. SetEnterState(true);
  65. Debug.Log("进入" + stepID + "步骤");
  66. EnterProProcess();
  67. }
  68. public void EnterProProcess()
  69. {
  70. if (preprocess == null)
  71. {
  72. ProProcessFinished();
  73. }
  74. else
  75. {
  76. preprocess.Enter(this);
  77. }
  78. }
  79. /// <summary>
  80. /// 预处理结束进度操作流程
  81. /// </summary>
  82. public void ProProcessFinished()
  83. {
  84. ProcessManagement.Instance.preprocessFnishedEvent?.Invoke(this);
  85. if (processBase == null)
  86. {
  87. Debug.LogError("缺少" + stepID + "步 ProcedureBase----" + this.name);
  88. Exit();
  89. return;
  90. }
  91. processBase.Enter(this);
  92. processElementEnterHandler?.Invoke(this);
  93. }
  94. /// <summary>
  95. /// 触发完成
  96. /// </summary>
  97. public void TriggerFinished()
  98. {
  99. processElementTriggerHandler?.Invoke(this);
  100. }
  101. /// <summary>
  102. /// 离开当前步骤
  103. /// </summary>
  104. public void Exit()
  105. {
  106. SetProcessActive(false);
  107. SetExitState();
  108. finished = true;
  109. processElementExitHandle?.Invoke(this);
  110. ProcessManagement.Instance.EnterNextProcess();
  111. }
  112. /// <summary>
  113. /// 操作过程中,中途退出(受跳步影响)
  114. /// </summary>
  115. /// <param name="preJump">向前跳步退出</param>
  116. public void QuitHalfWay()
  117. {
  118. AnimationDriver.StopAllAnimation();
  119. SetProcessActive(false);
  120. if (processBase != null)
  121. {
  122. processBase.QuitHalfWay();
  123. }
  124. if(preprocess!=null)
  125. {
  126. preprocess.QuitHalfWay();
  127. }
  128. foreach (var item in this.GetComponents<IProcessState>())
  129. {
  130. item.HalfQuit();
  131. }
  132. }
  133. /// <summary>
  134. /// 设置进入时状态
  135. /// </summary>
  136. /// <param name="preJump">向前跳步状态</param>
  137. public void SetEnterState(bool currentEnter = true)
  138. {
  139. if (processBase != null)
  140. {
  141. processBase.SetEnterState();
  142. }
  143. foreach (var item in this.GetComponents<IProcessState>())
  144. {
  145. item.EnterState(currentEnter);
  146. }
  147. }
  148. /// <summary>
  149. /// 设置离开时状态
  150. /// </summary>
  151. public void SetExitState()
  152. {
  153. if (processBase != null)
  154. {
  155. processBase.SetExitState();
  156. }
  157. foreach (var item in this.GetComponents<IProcessState>())
  158. {
  159. item.ExitState();
  160. }
  161. }
  162. [HideIf("processBase")]
  163. [Button("创建PB_OpData")]
  164. public ProcessBase InitOpData()
  165. {
  166. if (processBase == null)
  167. {
  168. processBase = this.gameObject.GetComponent<PB_OpData>() == null
  169. ? this.gameObject.AddComponent<PB_OpData>()
  170. : this.gameObject.GetComponent<PB_OpData>();
  171. }
  172. return processBase;
  173. }
  174. #region 参数设置
  175. /// <summary>
  176. /// 名字
  177. /// </summary>
  178. public void SetName()
  179. {
  180. if (processBase != null)
  181. {
  182. this.gameObject.name = "第" + stepID + "步:" + processBase.GetPBDescribe();
  183. return;
  184. }
  185. this.gameObject.name = "第" + stepID + "步";
  186. }
  187. public void SetName(string name)
  188. {
  189. this.gameObject.name = "第" + stepID + "步:" + name;
  190. }
  191. #endregion
  192. }
  193. }