Framework_YooAsset_HybridCLR/Assets/DemoGame/GameScript/Hotfix/Procedure/ProcedureManager.cs

99 lines
3.1 KiB
C#
Raw Permalink Normal View History

2024-07-19 10:52:33 +08:00
using System;
using System.Collections.Generic;
using UnityEngine;
namespace ZC
{
public interface IProcedureManager
{
// void StartProcedure<T>() where T : IProcedure;
void StartProcedure(ProcedureType procedureType);
// void ChangeProcedure<T>();
void ChangeProcedure(ProcedureType procedureType);
IProcedure GetProcedure(ProcedureType procedureType);
}
internal class ProcedureManager : ManagerBase<ProcedureManager>, IProcedureManager
{
private Dictionary<ProcedureType, IProcedure> _procedures = new Dictionary<ProcedureType, IProcedure>();
private IProcedure currentProcedure;
2024-11-12 16:57:51 +08:00
public override void OnInit(params object[] data)
2024-07-19 10:52:33 +08:00
{
2024-11-12 16:57:51 +08:00
base.OnInit(data);
2024-07-19 10:52:33 +08:00
var types = new List<(Type, ProcedureAttribute)>();
AssemblyManager.GetTypesInhertType(typeof(ProcedureBase), types);
foreach (var (type, procedureAttribute) in types)
{
var procedureType = procedureAttribute.ProcedureType;
_procedures.Add(procedureType, (IProcedure)Activator.CreateInstance(type, false));
}
foreach (var procedureBase in _procedures.Values)
{
procedureBase.Init();
Debug.Log($"add procedure : {procedureBase.procedureType}");
}
}
2024-11-12 16:57:51 +08:00
public override void OnDispose(params object[] data)
2024-07-19 10:52:33 +08:00
{
2024-11-12 16:57:51 +08:00
base.OnDispose(data);
2024-07-19 10:52:33 +08:00
_procedures = null;
}
public void AddProcedure(ProcedureBase[] procedureBases)
{
foreach (var procedureBase in procedureBases)
{
procedureBase.Init();
Debug.Log($"add procedure : {procedureBase.procedureType}");
this._procedures.Add(procedureBase.procedureType, procedureBase);
}
}
2024-11-12 16:57:51 +08:00
public override void OnUpdate(float time,params object[] data)
2024-07-19 10:52:33 +08:00
{
2024-11-12 16:57:51 +08:00
base.OnUpdate(time,data);
this.currentProcedure?.OnUpdate(time);
2024-07-19 10:52:33 +08:00
}
public void StartProcedure(ProcedureType procedureType)
{
if (this.currentProcedure != null)
this.currentProcedure.OnLeave();
if (this._procedures.TryGetValue(procedureType, out var procedure))
{
this.currentProcedure = procedure;
this.currentProcedure.OnEnter();
}
}
public void ChangeProcedure(ProcedureType procedureType)
{
if (this.currentProcedure != null)
this.currentProcedure.OnLeave();
if (this._procedures.TryGetValue(procedureType, out var procedure))
{
this.currentProcedure = procedure;
this.currentProcedure.OnEnter();
}
}
public IProcedure GetProcedure(ProcedureType procedureType)
{
if (this._procedures.TryGetValue(procedureType, out var procedure))
{
return procedure;
}
return null;
}
}
}