2025-11-18 16:15:11 +08:00
|
|
|
using System;
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using UnityEngine;
|
|
|
|
|
|
|
|
|
|
namespace AlicizaX
|
|
|
|
|
{
|
2026-03-26 16:14:05 +08:00
|
|
|
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;
|
2026-03-26 16:14:05 +08:00
|
|
|
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));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2026-03-26 16:14:05 +08:00
|
|
|
protected override void OnInitialize()
|
2025-11-18 16:15:11 +08:00
|
|
|
{
|
2026-03-26 16:14:05 +08:00
|
|
|
|
2025-11-18 16:15:11 +08:00
|
|
|
}
|
|
|
|
|
|
2026-03-26 16:14:05 +08:00
|
|
|
protected override void OnDestroyService()
|
|
|
|
|
{
|
|
|
|
|
ClearAllProcedures();
|
|
|
|
|
}
|
2025-11-18 16:15:11 +08:00
|
|
|
|
2026-03-26 16:14:05 +08:00
|
|
|
void IServiceTickable.Tick(float deltaTime)
|
2025-11-18 16:15:11 +08:00
|
|
|
{
|
|
|
|
|
if (_currentProcedure != null)
|
|
|
|
|
{
|
|
|
|
|
_currentProcedure.Update();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|