using System; namespace TEngine { /// /// 流程管理器。 /// internal sealed class ProcedureModule : Module, IProcedureModule { private IFsmModule _fsmModule; private IFsm _procedureFsm; /// /// 初始化流程管理器的新实例。 /// public ProcedureModule() { _fsmModule = null; _procedureFsm = null; } /// /// 获取游戏框架模块优先级。 /// /// 优先级较高的模块会优先轮询,并且关闭操作会后进行。 public 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; } } public override void OnInit() { } /// /// 关闭并清理流程管理器。 /// public override void Shutdown() { if (_fsmModule != null) { if (_procedureFsm != null) { _fsmModule.DestroyFsm(_procedureFsm); _procedureFsm = null; } _fsmModule = null; } } /// /// 初始化流程管理器。 /// /// 有限状态机管理器。 /// 流程管理器包含的流程。 public void Initialize(IFsmModule fsmModule, params ProcedureBase[] procedures) { if (fsmModule == null) { throw new GameFrameworkException("FSM manager is invalid."); } _fsmModule = fsmModule; _procedureFsm = _fsmModule.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); } /// /// 重启流程。 /// 默认使用第一个流程作为启动流程。 /// /// 新的的流程。 /// 是否重启成功。 /// 重启异常。 public bool RestartProcedure(params ProcedureBase[] procedures) { if (procedures == null || procedures.Length <= 0) { throw new GameFrameworkException("RestartProcedure Failed procedures is invalid."); } if (!_fsmModule.DestroyFsm()) { return false; } Initialize(_fsmModule, procedures); StartProcedure(procedures[0].GetType()); return true; } } }