ProcessElement.cs 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  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> processElementExitHandle;
  49. /// <summary>
  50. /// 流程使用状态
  51. /// </summary>
  52. /// <param name="state"></param>
  53. public void SetProcessActive(bool state)
  54. {
  55. active = state;
  56. }
  57. /// <summary>
  58. /// 进入当前步骤
  59. /// </summary>
  60. public void Enter()
  61. {
  62. SetProcessActive(true);
  63. SetEnterState(true);
  64. Debug.Log("进入" + stepID + "步骤");
  65. EnterProProcess();
  66. }
  67. public void EnterProProcess()
  68. {
  69. if (preprocess == null)
  70. {
  71. ProProcessFinished();
  72. }
  73. else
  74. {
  75. preprocess.Enter(this);
  76. }
  77. }
  78. /// <summary>
  79. /// 预处理结束进度操作流程
  80. /// </summary>
  81. public void ProProcessFinished()
  82. {
  83. ProcessManagement.Instance.preprocessFnishedEvent?.Invoke(this);
  84. if (processBase == null)
  85. {
  86. Debug.LogError("缺少" + stepID + "步 ProcedureBase----" + this.name);
  87. Exit();
  88. return;
  89. }
  90. processBase.Enter(this);
  91. processElementEnterHandler?.Invoke(this);
  92. }
  93. /// <summary>
  94. /// 离开当前步骤
  95. /// </summary>
  96. public void Exit()
  97. {
  98. SetProcessActive(false);
  99. SetExitState();
  100. finished = true;
  101. processElementExitHandle?.Invoke(this);
  102. ProcessManagement.Instance.EnterNextProcess();
  103. }
  104. /// <summary>
  105. /// 操作过程中,中途退出(受跳步影响)
  106. /// </summary>
  107. /// <param name="preJump">向前跳步退出</param>
  108. public void QuitHalfWay()
  109. {
  110. AnimationDriver.StopAllAnimation();
  111. SetProcessActive(false);
  112. if (processBase != null)
  113. {
  114. processBase.QuitHalfWay();
  115. }
  116. if(preprocess!=null)
  117. {
  118. preprocess.QuitHalfWay();
  119. }
  120. foreach (var item in this.GetComponents<IProcessState>())
  121. {
  122. item.HalfQuit();
  123. }
  124. }
  125. /// <summary>
  126. /// 设置进入时状态
  127. /// </summary>
  128. /// <param name="preJump">向前跳步状态</param>
  129. public void SetEnterState(bool currentEnter = true)
  130. {
  131. if (processBase != null)
  132. {
  133. processBase.SetEnterState();
  134. }
  135. foreach (var item in this.GetComponents<IProcessState>())
  136. {
  137. item.EnterState(currentEnter);
  138. }
  139. }
  140. /// <summary>
  141. /// 设置离开时状态
  142. /// </summary>
  143. public void SetExitState()
  144. {
  145. if (processBase != null)
  146. {
  147. processBase.SetExitState();
  148. }
  149. foreach (var item in this.GetComponents<IProcessState>())
  150. {
  151. item.ExitState();
  152. }
  153. }
  154. [HideIf("processBase")]
  155. [Button("创建PB_OpData")]
  156. public ProcessBase InitOpData()
  157. {
  158. if (processBase == null)
  159. {
  160. processBase = this.gameObject.GetComponent<PB_OpData>() == null
  161. ? this.gameObject.AddComponent<PB_OpData>()
  162. : this.gameObject.GetComponent<PB_OpData>();
  163. }
  164. return processBase;
  165. }
  166. #region 参数设置
  167. /// <summary>
  168. /// 名字
  169. /// </summary>
  170. public void SetName()
  171. {
  172. if (processBase != null)
  173. {
  174. this.gameObject.name = "第" + stepID + "步:" + processBase.GetPBDescribe();
  175. return;
  176. }
  177. this.gameObject.name = "第" + stepID + "步";
  178. }
  179. public void SetName(string name)
  180. {
  181. this.gameObject.name = "第" + stepID + "步:" + name;
  182. }
  183. #endregion
  184. }
  185. }