添加流程管理器

pull/1/head
zhangxl 2024-07-19 10:52:33 +08:00
parent 3feca978f6
commit b99d4df2cb
16 changed files with 301 additions and 0 deletions

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: a417fc0a3018aa842b6063d898d44411
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,13 @@
using System;
namespace ZC
{
public interface IProcedure
{
ProcedureType procedureType { get; }
void Init();
void OnEnter();
void OnUpdate(float dateTime);
void OnLeave();
}
}

View File

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 9f2b91c9316244849faa0d4f168cbc7e
timeCreated: 1712130599

View File

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: fb2f9fcc16a44d4cb389d7a19b16d758
timeCreated: 1712382042

View File

@ -0,0 +1,65 @@
using System.Collections.Generic;
using UnityEngine;
using ZGame;
namespace ZC
{
[Procedure(ProcedureType.GameSceneLogicProcedure)]
class GameSceneLogicProcedure : ProcedureBase
{
private Dictionary<string, List<GameObject>> dic = new Dictionary<string, List<GameObject>>();
TestZhongLi testZhongLi;
public override void Init()
{
base.Init();
EventManager.Instance.Subscribe(LoadModelEventArgs.EventId, this.LoadModelEvent);
EventManager.Instance.Subscribe(DeleteModelEventArgs.EventId, this.DeleteModelEvent);
testZhongLi = new TestZhongLi();
ZCGame.ObjectManager.Add(testZhongLi);
}
private void DeleteModelEvent(object sender, GameEventArgs e)
{
var args = e as DeleteModelEventArgs;
if (this.dic.TryGetValue(args.modelName, out var list))
{
GameObject.DestroyImmediate(list[0]);
list.RemoveAt(0);
}
}
private void LoadModelEvent(object sender, GameEventArgs e)
{
var args = e as LoadModelEventArgs;
var gameObject = ResourcesLocalComponent.Instance.LoadGameObjectSync(args.modelName);
if (this.dic.TryGetValue(args.modelName, out var list))
{
list.Add(gameObject);
}
else
{
this.dic[args.modelName] = new List<GameObject>() { gameObject };
}
}
public override void Dispose()
{
base.Dispose();
EventManager.Instance.Unsubscribe(LoadModelEventArgs.EventId, this.LoadModelEvent);
EventManager.Instance.Unsubscribe(DeleteModelEventArgs.EventId, this.DeleteModelEvent);
ZCGame.ObjectManager.Remove(this.testZhongLi.Id);
}
public override void OnEnter()
{
base.OnEnter();
}
public override void OnLeave()
{
base.OnLeave();
}
}
}

View File

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: cf5a711399ac4bc19ef745cf5811680f
timeCreated: 1719555722

View File

@ -0,0 +1,27 @@
using Cysharp.Threading.Tasks;
using UnityEngine;
namespace ZC
{
[Procedure(ProcedureType.LoadingGameSceneProcedure)]
class LoadingGameSceneProcedure : ProcedureBase
{
public override void OnEnter()
{
base.OnEnter();
UniTask.Create(async () =>
{
await ResourcesLocalComponent.Instance.LoadSceneAsync(AssetsConst.Assets_DemoGame_GameRes_Scene_Game_unity);
var loadAssetAsync = await ResourcesLocalComponent.Instance.LoadAssetAndInsAsync(AssetsConst.Assets_DemoGame_GameRes_Entity_Cube_prefab);
Debug.Log("加载的是:" + loadAssetAsync);
ZCGame.ProcedureManager.ChangeProcedure(ProcedureType.GameSceneLogicProcedure);
}).Forget();
}
public override void OnLeave()
{
base.OnLeave();
}
}
}

View File

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 2447a05f6e1b45ec8ad5ad14a079ea95
timeCreated: 1712134175

View File

@ -0,0 +1,15 @@
using System;
namespace ZC
{
[AttributeUsage(AttributeTargets.Class)]
class ProcedureAttribute: Attribute
{
public ProcedureType ProcedureType { get; set; }
public ProcedureAttribute(ProcedureType type)
{
this.ProcedureType = type;
}
}
}

View File

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 51afbf213c614f14aab69723edd5e136
timeCreated: 1712242973

View File

@ -0,0 +1,36 @@
using System;
using UnityEngine;
namespace ZC
{
abstract class ProcedureBase : IProcedure
{
private ProcedureType _procedureType;
public ProcedureType procedureType => this._procedureType;
public virtual void Init()
{
var value = this.GetType().ToString().Split(".");
this._procedureType = Enum.Parse<ProcedureType>(value[^1]);
}
public virtual void OnEnter()
{
Debug.Log($"Enter {procedureType} procedure !!!");
}
public virtual void OnUpdate(float dateTime)
{
}
public virtual void OnLeave()
{
Debug.Log($"Leave {procedureType} procedure !!!");
}
public virtual void Dispose()
{
}
}
}

View File

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 1d9dc4beeffa4c0694df15db53ae4125
timeCreated: 1712132542

View File

@ -0,0 +1,99 @@
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;
}
}
}

View File

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: b10aa4c32af342c694cfde07d1251365
timeCreated: 1712132397

View File

@ -0,0 +1,14 @@
namespace ZC
{
public enum ProcedureType
{
LoadingGameSceneProcedure,
GameSceneLogicProcedure,
// ZKMY
// StartSceneLogicProcedure,
// THYZSceneLogicProcedure,
// GSJSceneLogicProcedure,
// ModelSceneLogicProcedure // 模型展示流程(此流程对应一个场景,该场景里面展示所有的模型,每个模型需要展示的时候自行调用)
}
}

View File

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 23581277df974da1bae013af24dedd2f
timeCreated: 1712137086