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

136 lines
3.4 KiB
C#
Raw Normal View History

2025-11-18 16:15:11 +08:00
using System;
using System.Collections.Generic;
using UnityEngine;
namespace AlicizaX
{
internal class ProcedureService : ServiceBase, IProcedureService
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 void InitializeProcedure(List<IProcedure> availableProcedures, Type defaultProcedureType)
{
_procedures.Clear();
foreach (var procedure in availableProcedures)
{
var type = procedure.GetType();
_procedures[type] = procedure;
procedure.ProcedureService = this;
2025-11-18 16:15:11 +08:00
procedure.Init();
}
if (_procedures.ContainsKey(defaultProcedureType))
{
_defaultProcedure = _procedures[defaultProcedureType];
SwitchProcedure(defaultProcedureType);
}
else
{
Log.Info($"默认流程 {defaultProcedureType.Name} 未注册!");
}
}
/// <summary>
/// <summary>
/// 清除所有流程
/// </summary>
public void ClearAllProcedures()
{
if (_procedures != null)
{
foreach (var procedure in _procedures.Values)
{
procedure.Destroy();
}
_procedures.Clear();
}
_currentProcedure = null;
_defaultProcedure = null;
}
public bool SwitchProcedure<T>() where T : IProcedure
{
if (HasProcedure<T>())
{
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;
}
/// <summary>
/// 切换到默认流程
/// </summary>
private bool SwitchToDefault()
{
if (_defaultProcedure != null)
{
return SwitchProcedure(_defaultProcedure.GetType());
}
return false;
}
/// <summary>
/// 检查是否存在指定类型的流程
/// </summary>
private bool HasProcedure<T>() where T : IProcedure
{
return _procedures.ContainsKey(typeof(T));
}
protected override void OnInitialize()
2025-11-18 16:15:11 +08:00
{
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
{
if (_currentProcedure != null)
{
_currentProcedure.Update();
}
}
}
}