using System; using System.Collections.Generic; using UnityEngine; namespace ZC { public interface IProcedureManager { // void StartProcedure() where T : IProcedure; void StartProcedure(ProcedureType procedureType); // void ChangeProcedure(); void ChangeProcedure(ProcedureType procedureType); IProcedure GetProcedure(ProcedureType procedureType); } internal class ProcedureManager : ManagerBase, IProcedureManager { private Dictionary _procedures = new Dictionary(); private IProcedure currentProcedure; public override void OnInit(params object[] data) { base.OnInit(data); var types = new List<(Type, ProcedureAttribute)>(); AssemblyManager.GetTypesInhertType(typeof(ProcedureBase), types); foreach (var (type, procedureAttribute) in types) { var procedureType = procedureAttribute.ProcedureType; _procedures.Add(procedureType, (IProcedure)Activator.CreateInstance(type, false)); } foreach (var procedureBase in _procedures.Values) { procedureBase.Init(); Debug.Log($"add procedure : {procedureBase.procedureType}"); } } public override void OnDispose(params object[] data) { base.OnDispose(data); _procedures = null; } public void AddProcedure(ProcedureBase[] procedureBases) { foreach (var procedureBase in procedureBases) { procedureBase.Init(); Debug.Log($"add procedure : {procedureBase.procedureType}"); this._procedures.Add(procedureBase.procedureType, procedureBase); } } public override void OnUpdate(float time,params object[] data) { base.OnUpdate(time,data); this.currentProcedure?.OnUpdate(time); } public void StartProcedure(ProcedureType procedureType) { if (this.currentProcedure != null) this.currentProcedure.OnLeave(); if (this._procedures.TryGetValue(procedureType, out var procedure)) { this.currentProcedure = procedure; this.currentProcedure.OnEnter(); } } public void ChangeProcedure(ProcedureType procedureType) { if (this.currentProcedure != null) this.currentProcedure.OnLeave(); if (this._procedures.TryGetValue(procedureType, out var procedure)) { this.currentProcedure = procedure; this.currentProcedure.OnEnter(); } } public IProcedure GetProcedure(ProcedureType procedureType) { if (this._procedures.TryGetValue(procedureType, out var procedure)) { return procedure; } return null; } } }