using System; using System.Collections.Generic; using UnityEngine; namespace AlicizaX { internal class ProcedureService : ServiceBase, IProcedureService, IServiceTickable { private readonly Dictionary _procedures = new Dictionary(); private IProcedure _currentProcedure; private IProcedure _defaultProcedure; public Type CurrentProcedureType => _currentProcedure?.GetType(); public void InitializeProcedure(IEnumerable availableProcedures, Type defaultProcedureType) { _procedures.Clear(); foreach (var procedure in availableProcedures) { if (procedure == null) { continue; } var type = procedure.GetType(); _procedures[type] = procedure; procedure.ProcedureService = this; procedure.Init(); } if (_procedures.TryGetValue(defaultProcedureType, out var defaultProcedure)) { _defaultProcedure = defaultProcedure; TrySwitchProcedure(defaultProcedureType); } else { Log.Info($"榛樿娴佺▼ {defaultProcedureType.Name} 鏈敞鍐?"); } } public void ClearAllProcedures() { foreach (var procedure in _procedures.Values) { procedure.Destroy(); } _procedures.Clear(); _currentProcedure = null; _defaultProcedure = null; } public bool ContainsProcedure(Type procedureType) { return procedureType != null && _procedures.ContainsKey(procedureType); } public bool TrySwitchProcedure(Type procedureType) { if (procedureType == null) { return false; } if (!_procedures.TryGetValue(procedureType, out var nextProcedure)) { if (_defaultProcedure == null) { return false; } Debug.LogWarning($"娴佺▼ {procedureType.Name} 涓嶅瓨鍦紝鍒囨崲鍒伴粯璁ゆ祦绋?"); nextProcedure = _defaultProcedure; } if (ReferenceEquals(_currentProcedure, nextProcedure)) { return true; } _currentProcedure?.Leave(); nextProcedure.Enter(); _currentProcedure = nextProcedure; return true; } protected override void OnInitialize() { } protected override void OnDestroyService() { ClearAllProcedures(); } void IServiceTickable.Tick(float deltaTime) { _currentProcedure?.Update(); } } }