123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209 |
- namespace ChivaXR
- {
- using UnityEngine;
- using Sirenix.OdinInspector;
- /// <summary>
- /// 步骤跳转状态(步骤跳转时依据当前ProcessElement物体查找接口组件并执行)
- /// </summary>
- public interface IProcessState
- {
- /// <summary>
- /// 步骤初始状态
- /// </summary>
- /// <param name="enterCurrent">true:进入当前状态--false:向前跳步</param>
- void EnterState(bool enterCurrent);
- /// <summary>
- /// 步骤结束状态
- /// </summary>
- void ExitState();
- void HalfQuit();
- }
- /// <summary>
- /// 步骤组件
- /// </summary>
- public class ProcessElement : MonoBehaviour
- {
- /// <summary>
- /// 当前步骤StepID
- /// </summary>
- public int stepID;
- /// <summary>
- /// 当前步骤是否激活
- /// </summary>
- public bool active;
- /// <summary>
- /// 当前步骤完成情况
- /// </summary>
- public bool finished;
- /// <summary>
- /// 操作前预处理逻辑
- /// </summary>
- [HideInInspector]
- public PreprocessBase preprocess;
- /// <summary>
- /// 操作类基类
- /// </summary>
- public ProcessBase processBase;
- public System.Action<ProcessElement> processElementEnterHandler;
- public System.Action<ProcessElement> processElementExitHandle;
- /// <summary>
- /// 流程使用状态
- /// </summary>
- /// <param name="state"></param>
- public void SetProcessActive(bool state)
- {
- active = state;
- }
- /// <summary>
- /// 进入当前步骤
- /// </summary>
- public void Enter()
- {
- SetProcessActive(true);
- SetEnterState(true);
- Debug.Log("进入" + stepID + "步骤");
- EnterProProcess();
- }
- public void EnterProProcess()
- {
- if (preprocess == null)
- {
- ProProcessFinished();
- }
- else
- {
- preprocess.Enter(this);
- }
- }
- /// <summary>
- /// 预处理结束进度操作流程
- /// </summary>
- public void ProProcessFinished()
- {
- ProcessManagement.Instance.preprocessFnishedEvent?.Invoke(this);
- if (processBase == null)
- {
- Debug.LogError("缺少" + stepID + "步 ProcedureBase----" + this.name);
- Exit();
- return;
- }
- processBase.Enter(this);
- processElementEnterHandler?.Invoke(this);
- }
- /// <summary>
- /// 离开当前步骤
- /// </summary>
- public void Exit()
- {
- SetProcessActive(false);
- SetExitState();
- finished = true;
- processElementExitHandle?.Invoke(this);
- ProcessManagement.Instance.EnterNextProcess();
- }
- /// <summary>
- /// 操作过程中,中途退出(受跳步影响)
- /// </summary>
- /// <param name="preJump">向前跳步退出</param>
- public void QuitHalfWay()
- {
- AnimationDriver.StopAllAnimation();
- SetProcessActive(false);
- if (processBase != null)
- {
- processBase.QuitHalfWay();
- }
- if(preprocess!=null)
- {
- preprocess.QuitHalfWay();
- }
- foreach (var item in this.GetComponents<IProcessState>())
- {
- item.HalfQuit();
- }
- }
- /// <summary>
- /// 设置进入时状态
- /// </summary>
- /// <param name="preJump">向前跳步状态</param>
- public void SetEnterState(bool currentEnter = true)
- {
- if (processBase != null)
- {
- processBase.SetEnterState();
- }
- foreach (var item in this.GetComponents<IProcessState>())
- {
- item.EnterState(currentEnter);
- }
- }
- /// <summary>
- /// 设置离开时状态
- /// </summary>
- public void SetExitState()
- {
- if (processBase != null)
- {
- processBase.SetExitState();
- }
- foreach (var item in this.GetComponents<IProcessState>())
- {
- item.ExitState();
- }
- }
- [HideIf("processBase")]
- [Button("创建PB_OpData")]
- public ProcessBase InitOpData()
- {
- if (processBase == null)
- {
- processBase = this.gameObject.GetComponent<PB_OpData>() == null
- ? this.gameObject.AddComponent<PB_OpData>()
- : this.gameObject.GetComponent<PB_OpData>();
- }
- return processBase;
- }
- #region 参数设置
- /// <summary>
- /// 名字
- /// </summary>
- public void SetName()
- {
- if (processBase != null)
- {
- this.gameObject.name = "第" + stepID + "步:" + processBase.GetPBDescribe();
- return;
- }
- this.gameObject.name = "第" + stepID + "步";
- }
- public void SetName(string name)
- {
- this.gameObject.name = "第" + stepID + "步:" + name;
- }
- #endregion
- }
- }
|