using System; using System.Collections.Generic; using UnityEngine; namespace AlicizaX { internal class ProcedureService : ServiceBase, IProcedureService { private readonly Dictionary _procedures = new Dictionary(); private IProcedure _currentProcedure; private IProcedure _defaultProcedure; public void InitializeProcedure(List availableProcedures, Type defaultProcedureType) { _procedures.Clear(); foreach (var procedure in availableProcedures) { var type = procedure.GetType(); _procedures[type] = procedure; procedure.ProcedureService = this; procedure.Init(); } if (_procedures.ContainsKey(defaultProcedureType)) { _defaultProcedure = _procedures[defaultProcedureType]; SwitchProcedure(defaultProcedureType); } else { Log.Info($"默认流程 {defaultProcedureType.Name} 未注册!"); } } /// /// /// 清除所有流程 /// public void ClearAllProcedures() { if (_procedures != null) { foreach (var procedure in _procedures.Values) { procedure.Destroy(); } _procedures.Clear(); } _currentProcedure = null; _defaultProcedure = null; } public bool SwitchProcedure() where T : IProcedure { if (HasProcedure()) { return SwitchProcedure(typeof(T)); } if (_defaultProcedure != null) { Debug.LogWarning($"流程 {typeof(T).Name} 不存在,切换到默认流程"); return SwitchToDefault(); } return false; } public bool SwitchProcedure(Type procedureType) { var nextProcedure = _procedures[procedureType]; var lastProcedure = _currentProcedure; if (lastProcedure == nextProcedure) return true; if (lastProcedure != null) { lastProcedure.Leave(); } nextProcedure.Enter(); _currentProcedure = nextProcedure; return true; } /// /// 切换到默认流程 /// private bool SwitchToDefault() { if (_defaultProcedure != null) { return SwitchProcedure(_defaultProcedure.GetType()); } return false; } /// /// 检查是否存在指定类型的流程 /// private bool HasProcedure() where T : IProcedure { return _procedures.ContainsKey(typeof(T)); } protected override void OnInitialize() { } protected override void OnDestroyService() { ClearAllProcedures(); } void IServiceTickable.Tick(float deltaTime) { if (_currentProcedure != null) { _currentProcedure.Update(); } } } }