com.alicizax.unity.framework/Runtime/Procedure/ProcedureService.cs
陈思海 6397cc03b2 框架大更新
1.进步优化UI系统 加载问题 性能问题 Canvas重绘问题 边界处理问题
2.优化对象池和游戏对象池的性能 游戏对象池根据窗口 策略定期清理
3.优化整个AppService 和ServiceWorld结构 固定三大类 具体参考代码
2026-03-31 17:25:20 +08:00

103 lines
2.9 KiB
C#

using System;
using System.Collections.Generic;
using UnityEngine;
namespace AlicizaX
{
internal class ProcedureService : ServiceBase, IProcedureService
{
private readonly Dictionary<Type, IProcedure> _procedures = new Dictionary<Type, IProcedure>();
private IProcedure _currentProcedure;
private IProcedure _defaultProcedure;
public Type CurrentProcedureType => _currentProcedure?.GetType();
public void InitializeProcedure(IEnumerable<IProcedure> 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();
}
}
}