using System; namespace TEngine { /// /// 流程管理器。 /// internal sealed class ProcedureManager : ModuleImp, IProcedureManager { private IFsmManager _fsmManager; private IFsm _procedureFsm; /// /// 初始化流程管理器的新实例。 /// public ProcedureManager() { _fsmManager = null; _procedureFsm = null; } /// /// 获取游戏框架模块优先级。 /// /// 优先级较高的模块会优先轮询,并且关闭操作会后进行。 internal override int Priority => -2; /// /// 获取当前流程。 /// public ProcedureBase CurrentProcedure { get { if (_procedureFsm == null) { throw new GameFrameworkException("You must initialize procedure first."); } return (ProcedureBase)_procedureFsm.CurrentState; } } /// /// 获取当前流程持续时间。 /// public float CurrentProcedureTime { get { if (_procedureFsm == null) { throw new GameFrameworkException("You must initialize procedure first."); } return _procedureFsm.CurrentStateTime; } } /// /// 流程管理器轮询。 /// /// 逻辑流逝时间,以秒为单位。 /// 真实流逝时间,以秒为单位。 internal override void Update(float elapseSeconds, float realElapseSeconds) { } /// /// 关闭并清理流程管理器。 /// internal override void Shutdown() { if (_fsmManager != null) { if (_procedureFsm != null) { _fsmManager.DestroyFsm(_procedureFsm); _procedureFsm = null; } _fsmManager = null; } } /// /// 初始化流程管理器。 /// /// 有限状态机管理器。 /// 流程管理器包含的流程。 public void Initialize(IFsmManager fsmManager, params ProcedureBase[] procedures) { if (fsmManager == null) { throw new GameFrameworkException("FSM manager is invalid."); } _fsmManager = fsmManager; _procedureFsm = _fsmManager.CreateFsm(this, procedures); } /// /// 开始流程。 /// /// 要开始的流程类型。 public void StartProcedure() where T : ProcedureBase { if (_procedureFsm == null) { throw new GameFrameworkException("You must initialize procedure first."); } _procedureFsm.Start(); } /// /// 开始流程。 /// /// 要开始的流程类型。 public void StartProcedure(Type procedureType) { if (_procedureFsm == null) { throw new GameFrameworkException("You must initialize procedure first."); } _procedureFsm.Start(procedureType); } /// /// 是否存在流程。 /// /// 要检查的流程类型。 /// 是否存在流程。 public bool HasProcedure() where T : ProcedureBase { if (_procedureFsm == null) { throw new GameFrameworkException("You must initialize procedure first."); } return _procedureFsm.HasState(); } /// /// 是否存在流程。 /// /// 要检查的流程类型。 /// 是否存在流程。 public bool HasProcedure(Type procedureType) { if (_procedureFsm == null) { throw new GameFrameworkException("You must initialize procedure first."); } return _procedureFsm.HasState(procedureType); } /// /// 获取流程。 /// /// 要获取的流程类型。 /// 要获取的流程。 public ProcedureBase GetProcedure() where T : ProcedureBase { if (_procedureFsm == null) { throw new GameFrameworkException("You must initialize procedure first."); } return _procedureFsm.GetState(); } /// /// 获取流程。 /// /// 要获取的流程类型。 /// 要获取的流程。 public ProcedureBase GetProcedure(Type procedureType) { if (_procedureFsm == null) { throw new GameFrameworkException("You must initialize procedure first."); } return (ProcedureBase)_procedureFsm.GetState(procedureType); } } }