using System; using System.Collections.Generic; using UnityEngine; namespace Game { public interface IProcedureManager { // void StartProcedure() where T : IProcedure; void StartProcedure(ProcedureType procedureType); // void ChangeProcedure(); void ChangeProcedure(ProcedureType procedureType); IProcedure GetProcedure(ProcedureType procedureType); } class ProcedureManager : ManagerBase, IProcedureManager { private Dictionary _procedures = new Dictionary(); private IProcedure currentProcedure; protected override void OnInit() { base.OnInit(); 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}"); } } protected override void OnDispose() { base.OnDispose(); _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); } } protected override void OnUpdate(float dateTime) { base.OnUpdate(dateTime); this.currentProcedure?.OnUpdate(dateTime); } 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; } } }