99 lines
3.0 KiB
C#
99 lines
3.0 KiB
C#
|
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;
|
|||
|
|
|||
|
public override void OnInit()
|
|||
|
{
|
|||
|
base.OnInit();
|
|||
|
|
|||
|
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}");
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public override void OnDispose()
|
|||
|
{
|
|||
|
base.OnDispose();
|
|||
|
_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);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public override void OnUpdate(float dateTime)
|
|||
|
{
|
|||
|
base.OnUpdate(dateTime);
|
|||
|
this.currentProcedure?.OnUpdate(dateTime);
|
|||
|
}
|
|||
|
|
|||
|
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;
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
}
|