using System; using System.Collections; using UnityEngine; using UnityEngine.Serialization; namespace TEngine { /// /// 流程管理模块。 /// [DisallowMultipleComponent] public sealed class ProcedureModule : Module { private IProcedureManager _procedureManager = null; private ProcedureBase _entranceProcedure = null; [SerializeField] private string[] availableProcedureTypeNames = null; [SerializeField] private string entranceProcedureTypeName = null; /// /// 获取当前流程。 /// public ProcedureBase CurrentProcedure { get { if (_procedureManager == null) { return null; } return _procedureManager.CurrentProcedure; } } /// /// 获取当前流程持续时间。 /// public float CurrentProcedureTime { get { if (_procedureManager == null) { return 0f; } return _procedureManager.CurrentProcedureTime; } } /// /// 游戏框架模块初始化。 /// protected override void Awake() { base.Awake(); _procedureManager = ModuleImpSystem.GetModule(); if (_procedureManager == null) { Log.Fatal("Procedure manager is invalid."); } } private IEnumerator Start() { ProcedureBase[] procedures = new ProcedureBase[availableProcedureTypeNames.Length]; for (int i = 0; i < availableProcedureTypeNames.Length; i++) { Type procedureType = Utility.Assembly.GetType(availableProcedureTypeNames[i]); if (procedureType == null) { Log.Error("Can not find procedure type '{0}'.", availableProcedureTypeNames[i]); yield break; } procedures[i] = (ProcedureBase)Activator.CreateInstance(procedureType); if (procedures[i] == null) { Log.Error("Can not create procedure instance '{0}'.", availableProcedureTypeNames[i]); yield break; } if (entranceProcedureTypeName == availableProcedureTypeNames[i]) { _entranceProcedure = procedures[i]; } } if (_entranceProcedure == null) { Log.Error("Entrance procedure is invalid."); yield break; } _procedureManager.Initialize(ModuleImpSystem.GetModule(), procedures); yield return new WaitForEndOfFrame(); _procedureManager.StartProcedure(_entranceProcedure.GetType()); } /// /// 是否存在流程。 /// /// 要检查的流程类型。 /// 是否存在流程。 public bool HasProcedure() where T : ProcedureBase { return _procedureManager.HasProcedure(); } /// /// 是否存在流程。 /// /// 要检查的流程类型。 /// 是否存在流程。 public bool HasProcedure(Type procedureType) { return _procedureManager.HasProcedure(procedureType); } /// /// 获取流程。 /// /// 要获取的流程类型。 /// 要获取的流程。 public ProcedureBase GetProcedure() where T : ProcedureBase { return _procedureManager.GetProcedure(); } /// /// 获取流程。 /// /// 要获取的流程类型。 /// 要获取的流程。 public ProcedureBase GetProcedure(Type procedureType) { return _procedureManager.GetProcedure(procedureType); } /// /// 重启流程。 /// 默认使用第一个流程作为启动流程。 /// /// 新的的流程。 /// 是否重启成功。 /// 重启异常。 public bool RestartProcedure(params ProcedureBase[] procedures) { if (procedures == null || procedures.Length <= 0) { throw new GameFrameworkException("RestartProcedure Failed procedures is invalid."); } IFsmManager fsmManager = ModuleImpSystem.GetModule(); if (!fsmManager.DestroyFsm()) { return false; } _procedureManager = null; _procedureManager = ModuleImpSystem.GetModule(); _procedureManager.Initialize(fsmManager, procedures); _procedureManager.StartProcedure(procedures[0].GetType()); return true; } } }