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;
|
|
|
|
|
|
2026-03-31 17:25:20 +08:00
|
|
|
public Type CurrentProcedureType => _currentProcedure?.GetType();
|
2025-11-18 16:15:11 +08:00
|
|
|
|
2026-03-31 17:25:20 +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)
|
|
|
|
|
{
|
2026-03-31 17:25:20 +08:00
|
|
|
if (procedure == null)
|
|
|
|
|
{
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
2025-11-18 16:15:11 +08:00
|
|
|
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();
|
|
|
|
|
}
|
|
|
|
|
|
2026-03-31 17:25:20 +08:00
|
|
|
if (_procedures.TryGetValue(defaultProcedureType, out var defaultProcedure))
|
2025-11-18 16:15:11 +08:00
|
|
|
{
|
2026-03-31 17:25:20 +08:00
|
|
|
_defaultProcedure = defaultProcedure;
|
|
|
|
|
TrySwitchProcedure(defaultProcedureType);
|
2025-11-18 16:15:11 +08:00
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
2026-03-31 17:25:20 +08:00
|
|
|
Log.Info($"榛樿娴佺▼ {defaultProcedureType.Name} 鏈敞鍐?");
|
2025-11-18 16:15:11 +08:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void ClearAllProcedures()
|
|
|
|
|
{
|
2026-03-31 17:25:20 +08:00
|
|
|
foreach (var procedure in _procedures.Values)
|
2025-11-18 16:15:11 +08:00
|
|
|
{
|
2026-03-31 17:25:20 +08:00
|
|
|
procedure.Destroy();
|
2025-11-18 16:15:11 +08:00
|
|
|
}
|
|
|
|
|
|
2026-03-31 17:25:20 +08:00
|
|
|
_procedures.Clear();
|
2025-11-18 16:15:11 +08:00
|
|
|
_currentProcedure = null;
|
|
|
|
|
_defaultProcedure = null;
|
|
|
|
|
}
|
|
|
|
|
|
2026-03-31 17:25:20 +08:00
|
|
|
public bool ContainsProcedure(Type procedureType)
|
2025-11-18 16:15:11 +08:00
|
|
|
{
|
2026-03-31 17:25:20 +08:00
|
|
|
return procedureType != null && _procedures.ContainsKey(procedureType);
|
|
|
|
|
}
|
2025-11-18 16:15:11 +08:00
|
|
|
|
2026-03-31 17:25:20 +08:00
|
|
|
public bool TrySwitchProcedure(Type procedureType)
|
|
|
|
|
{
|
|
|
|
|
if (procedureType == null)
|
2025-11-18 16:15:11 +08:00
|
|
|
{
|
2026-03-31 17:25:20 +08:00
|
|
|
return false;
|
2025-11-18 16:15:11 +08:00
|
|
|
}
|
|
|
|
|
|
2026-03-31 17:25:20 +08:00
|
|
|
if (!_procedures.TryGetValue(procedureType, out var nextProcedure))
|
|
|
|
|
{
|
|
|
|
|
if (_defaultProcedure == null)
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
2025-11-18 16:15:11 +08:00
|
|
|
|
2026-03-31 17:25:20 +08:00
|
|
|
Debug.LogWarning($"娴佺▼ {procedureType.Name} 涓嶅瓨鍦紝鍒囨崲鍒伴粯璁ゆ祦绋?");
|
|
|
|
|
nextProcedure = _defaultProcedure;
|
|
|
|
|
}
|
2025-11-18 16:15:11 +08:00
|
|
|
|
2026-03-31 17:25:20 +08:00
|
|
|
if (ReferenceEquals(_currentProcedure, nextProcedure))
|
2025-11-18 16:15:11 +08:00
|
|
|
{
|
2026-03-31 17:25:20 +08:00
|
|
|
return true;
|
2025-11-18 16:15:11 +08:00
|
|
|
}
|
|
|
|
|
|
2026-03-31 17:25:20 +08:00
|
|
|
_currentProcedure?.Leave();
|
2025-11-18 16:15:11 +08:00
|
|
|
nextProcedure.Enter();
|
|
|
|
|
_currentProcedure = nextProcedure;
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
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
|
|
|
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
|
|
|
{
|
2026-03-31 17:25:20 +08:00
|
|
|
_currentProcedure?.Update();
|
2025-11-18 16:15:11 +08:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|