using System; using AlicizaX.Fsm.Runtime; using AlicizaX.Runtime; namespace AlicizaX.Procedure.Runtime { /// /// 流程管理器。 /// [UnityEngine.Scripting.Preserve] internal sealed class ProcedureManager : IProcedureManager { private IFsmManager m_FsmManager; private IFsm m_ProcedureFsm; /// /// 初始化流程管理器的新实例。 /// public ProcedureManager() { m_FsmManager = null; m_ProcedureFsm = null; } /// /// 获取当前流程。 /// public ProcedureBase CurrentProcedure { get { if (m_ProcedureFsm == null) { throw new GameFrameworkException("You must initialize procedure first."); } return (ProcedureBase)m_ProcedureFsm.CurrentState; } } /// /// 获取当前流程持续时间。 /// public float CurrentProcedureTime { get { if (m_ProcedureFsm == null) { throw new GameFrameworkException("You must initialize procedure first."); } return m_ProcedureFsm.CurrentStateTime; } } /// /// 关闭并清理流程管理器。 /// void IModule.Dispose() { if (m_FsmManager != null) { if (m_ProcedureFsm != null) { m_FsmManager.DestroyFsm(m_ProcedureFsm); m_ProcedureFsm = null; } m_FsmManager = null; } } /// /// 初始化流程管理器。 /// /// 有限状态机管理器。 /// 流程管理器包含的流程。 public void Initialize(IFsmManager fsmManager, params ProcedureBase[] procedures) { GameFrameworkGuard.NotNull(fsmManager, nameof(fsmManager)); m_FsmManager = fsmManager; m_ProcedureFsm = m_FsmManager.CreateFsm(this, procedures); } /// /// 开始流程。 /// /// 要开始的流程类型。 public void StartProcedure() where T : ProcedureBase { if (m_ProcedureFsm == null) { throw new GameFrameworkException("You must initialize procedure first."); } m_ProcedureFsm.Start(); } /// /// 开始流程。 /// /// 要开始的流程类型。 public void StartProcedure(Type procedureType) { if (m_ProcedureFsm == null) { throw new GameFrameworkException("You must initialize procedure first."); } m_ProcedureFsm.Start(procedureType); } /// /// 是否存在流程。 /// /// 要检查的流程类型。 /// 是否存在流程。 public bool HasProcedure() where T : ProcedureBase { if (m_ProcedureFsm == null) { throw new GameFrameworkException("You must initialize procedure first."); } return m_ProcedureFsm.HasState(); } /// /// 是否存在流程。 /// /// 要检查的流程类型。 /// 是否存在流程。 public bool HasProcedure(Type procedureType) { if (m_ProcedureFsm == null) { throw new GameFrameworkException("You must initialize procedure first."); } return m_ProcedureFsm.HasState(procedureType); } /// /// 获取流程。 /// /// 要获取的流程类型。 /// 要获取的流程。 public ProcedureBase GetProcedure() where T : ProcedureBase { if (m_ProcedureFsm == null) { throw new GameFrameworkException("You must initialize procedure first."); } return m_ProcedureFsm.GetState(); } /// /// 获取流程。 /// /// 要获取的流程类型。 /// 要获取的流程。 public ProcedureBase GetProcedure(Type procedureType) { if (m_ProcedureFsm == null) { throw new GameFrameworkException("You must initialize procedure first."); } return (ProcedureBase)m_ProcedureFsm.GetState(procedureType); } } }