com.alicizax.unity.framework/Runtime/Procedure/ProcedureService.cs

103 lines
2.9 KiB
C#
Raw Normal View History

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