Unity QFrameWork--Architecture

news/2025/1/15 14:14:35/文章来源:https://www.cnblogs.com/Z-wzy/p/18672900

Architecture

Architecture代码
using System;
using System.Collections.Generic;namespace QFramework
{public interface IArchitecture{/// <summary>/// 注册系统/// </summary>void RegisterSystem<T>(T instance) where T : ISystem; // 新增/// <summary>/// 注册 Model/// </summary>void RegisterModel<T>(T instance) where T : IModel;/// <summary>/// 注册 Utility/// </summary>void RegisterUtility<T>(T instance) where T : IUtility;/// <summary>/// 获取系统/// </summary>T GetSystem<T>() where T : class, ISystem;/// <summary>/// 获取数据/// </summary>T GetModel<T>() where T : class, IModel;/// <summary>/// 获取工具/// </summary>T GetUtility<T>() where T : class, IUtility;void SendCommand<T>() where T : ICommand, new();void SendCommand<T>(T command) where T : ICommand;/// <summary>/// 发送事件/// </summary>void SendEvent<T>() where T : new(); /// <summary>/// 发送事件/// </summary>void SendEvent<T>(T e);/// <summary>/// 注册事件/// </summary>IUnRegister RegisterEvent<T>(Action<T> onEvent);/// <summary>/// 注销事件/// </summary>void UnRegisterEvent<T>(Action<T> onEvent);}/// <summary>/// 架构/// </summary>/// <typeparam name="T"></typeparam>public abstract class Architecture<T> : IArchitecture where T : Architecture<T>, new(){/// <summary>/// 是否已经初始化完成/// </summary>private bool mInited = false;/// <summary>/// 用于初始化的 Systems 的缓存/// </summary>private List<ISystem> mSystems = new List<ISystem>(); // 新增// 提供一个注册 Model 的 APIpublic void RegisterSystem<T>(T instance) where T : ISystem // 新增{// 需要给 Model 赋值一下instance.SetArchitecture(this);mContainer.Register<T>(instance);// 如果初始化过了if (mInited){instance.Init();}else{// 添加到 Model 缓存中,用于初始化mSystems.Add(instance);}}/// <summary>/// 用于初始化的 Models 的缓存/// </summary>private List<IModel> mModels = new List<IModel>();public void RegisterModel<T>(T instance) where T : IModel{// 需要给 Model 赋值一下instance.SetArchitecture(this);mContainer.Register<T>(instance);// 如果初始化过了if (mInited){instance.Init();}else{// 添加到 Model 缓存中,用于初始化mModels.Add(instance);}}public T GetModel<T>() where T : class, IModel{return mContainer.Get<T>();}#region 类似单例模式 但是仅在内部课访问/// <summary>/// 注册补丁/// </summary>public static Action<T> OnRegisterPatch = architecture=> { };private static T mArchitecture = null;public static IArchitecture Interface{get {if(mArchitecture == null){MakeSureArchitecture();}return mArchitecture;}}// 确保 Container 是有实例的static void MakeSureArchitecture(){ if (mArchitecture == null){mArchitecture = new T();mArchitecture.Init();// 调用OnRegisterPatch?.Invoke(mArchitecture);// 初始化 Modelforeach (var architectureModel in mArchitecture.mModels){architectureModel.Init();}// 清空 ModelmArchitecture.mModels.Clear();// 初始化 Systemforeach (var architectureSystem in mArchitecture.mSystems) // 新增{architectureSystem.Init();}// 清空 SystemmArchitecture.mSystems.Clear(); // 新增mArchitecture.mInited = true;}}#endregionprivate IOCContainer mContainer = new IOCContainer();// 留给子类注册模块protected abstract void Init();// 提供一个注册模块的 APIpublic static void Register<T>(T instance){MakeSureArchitecture();mArchitecture.mContainer.Register<T>(instance);}public void RegisterUtility<T>(T instance) where T : IUtility{mContainer.Register<T>(instance);}public T GetUtility<T>() where T : class, IUtility{return mContainer.Get<T>();}public T GetSystem<T>() where T : class, ISystem{return mContainer.Get<T>();}// 提供一个获取模块的 APIpublic static T Get<T>() where T : class{MakeSureArchitecture();return mArchitecture.mContainer.Get<T>();}public void SendCommand<T>() where T : ICommand, new(){var command = new T();command.SetArchitecture(this);command.Excute();command.SetArchitecture(null);}public void SendCommand<T>(T command) where T : ICommand{command.SetArchitecture(this);command.Excute();command.SetArchitecture(null);}ITypeEventSystem mtypeEventSystem = new TypeEventSystem();public void SendEvent<T>() where T : new(){mtypeEventSystem.Send<T>();}public void SendEvent<T>(T e){mtypeEventSystem.Send<T>(e);}public IUnRegister RegisterEvent<T>(Action<T> onEvent){return mtypeEventSystem.Register<T>(onEvent);}public void UnRegisterEvent<T>(Action<T> onEvent){mtypeEventSystem.UnRegister<T>(onEvent);}}
}

代码解释

代码非常长,主体是架构,单例的模式,相当于一款游戏中你把这个挂在到总的游戏中,下面你不同层的东西可以用这个架构访问,类似于中转站

用法说明

//各种注册
void RegisterSystem<T>(T instance) where T : ISystem;
void RegisterModel<T>(T instance) where T : IModel;
void RegisterUtility<T>(T instance) where T : IUtility;
//获取方法
T GetModel<T>() where T : class, IModel; // 数据
T GetSystem<T>() where T : class, ISystem; // 系统
T GetUtility<T>() where T : class, IUtility; //工具
// Command用法
void SendCommand<T>() where T : ICommand, new(); // 发送命令
void SendCommand<T>(T command) where T : ICommand; // 发送命令
// Event用法
IUnRegister RegisterEvent<T>(Action<T> onEvent); // 注册事件
void UnRegisterEvent<T>(Action<T> onEvent);  // 注销事件
void SendEvent<T>() where T : new();  // 发送事件
void SendEvent<T>(T e); // 发送事件

下面是示例

using System.Diagnostics;
using UnityEngine;
namespace QFramework.E.g{public class PointGame : Architecture<PointGame>{protected override void Init(){RegisterSystem<IAchievementSystem>(new AchievementSystem()); // 注册系统RegisterModel<IGameModel>(new GameModel()); // 注册数据}}
}this.RegisterEvent<GamePassEvent>(OnGamePass);
private void OnGamePass(GamePassEvent e){transform.Find("Canvas/GamePass").gameObject.SetActive(true);
}
this.UnRegisterEvent<GamePassEvent>(OnGamePass);this.RegisterEvent<GamePassEvent>(e =>{transform.Find("Canvas/Show/BestScore").GetComponent<TMP_Text>().text = "BestSocre: " + this.GetModel<IGameModel>().BestScore.Value.ToString();}).UnRegisterWhenGameObjectDestroyed(this.gameObject);
// Command
this.SendEvent<BestScoreEvent>(); // 触发事件

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/869598.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何解决使用 SQL Server 管理器远程操作数据库时出现“索引超出了数组界限 (Microsoft.SqlServer.Smo)”错误?

问题描述 当您使用 SQL Server Management Studio (SSMS) 远程连接并操作数据库时,可能会遇到以下错误提示:“索引超出了数组界限 (Microsoft.SqlServer.Smo)”。这个错误通常发生在尝试执行某些特定操作(如查询、修改表结构等)时。该问题不仅影响工作效率,还可能导致数据…

如何处理wdcp控制面板内phpMyAdmin无法访问的问题

用户反馈其wdcp控制面板内的phpMyAdmin无法正常访问,尽管已经修改了密码,但仍提示错误。这可能是由于权限设置错误、配置文件损坏或其他服务器配置问题引起的。 解决方案确认登录凭据确认当前使用的用户名和密码是否正确。如果不确定密码是否正确,可以尝试通过找回密码功能重…

如何处理网站内容被删除并恢复数据库文件的问题

用户反馈其网站内容被删除,希望恢复特定日期(如4月13日)的数据库备份文件。这可能是由于恶意攻击、误操作或其他未知原因引起的。 解决方案确认备份情况登录到托管服务提供商的管理面板,查看是否有可用的备份文件。特别关注指定日期(如4月13日)的备份。 如果发现备份文件…

宝塔面板忘记账号或密码的解决办法来了

宝塔面板安装成功后会随机生成账号密码,如果忘记账号或密码,可以通过SSH命令找回或修改。找回默认账号密码:bashbt default修改密码:bashcd /www/server/panel && python tools.py panel 新密码修改用户名:bashbt 06 新用户名解释:bt default:显示默认的账号和密…

无人机运货

我们的货物一共有重量和体积两种属性,看题目不难看出,至少要有一种属性达到标准才能被无人机搬走,那最简单的结果就出来了:当一件货物的重量和体积都大的离谱的时候,就没有无人机能把它搬动,此时输出的就是-1,反之就一定能有结果。那么,我们将货物进行分类,分成只能被…

西藏定日县6.8级地震InSAR处理详细操作教程

据中国地震台网中心测定:北京时2025年1月7日9时5分,西藏日喀则市定日县(北纬28.5度,东经87.45度)发生6.8级地震,震源深度10千米。 本文以哨兵1A作为数据源,使用DInSAR的方法对本次地震进行干涉测量处理。本文旨在介绍软件处理操作,结果仅供参考,准确结果以官方发布为准…

C# DataGridView删除指定行

C# DataGridView删除指定行| Id | Title | DateAdded | SourceUrl | PostType | Body | BlogId | Description | DateUpdated | IsMarkdown | EntryName | CreatedTime | IsActive | AutoDesc | AccessPermission | | -------------| -------------| -------------| ----------…

C# DataGridView自动保存列的宽度和位置

C# DataGridView自动保存列的宽度和位置| Id | Title | DateAdded | SourceUrl | PostType | Body | BlogId | Description | DateUpdated | IsMarkdown | EntryName | CreatedTime | IsActive | AutoDesc | AccessPermission | | -------------| -------------| -------------…

2025年——29款顶级项目管理工具,提升工作效率必备!

在2025年的数字化时代,项目管理已成为企业成功不可或缺的一环。随着技术的飞速发展,各种项目管理工具应运而生,旨在帮助团队更高效、更准确地完成任务。今天,我们将为大家介绍30款顶级项目管理工具,这些工具不仅涵盖了从任务分配到资源管理的各个方面,还能通过智能化手段…

【PCIE734-1 】基于 PCIe 总线架构的 XCKU060 FPGA 4 路 SFP+光纤通道处理平台

产品概述 PCIE734-1 是一款基于 PCIE 总线架构的 Kintex UltraScale 系列 XCKU060 FPGA 高性能 4 路 SFP+光纤数据处理平台。该平台具有 1 个 PCIe Gen3 x8 主机接口、4 个 SFP+ 10G 光纤接口,可以实现 4 路 SFP+ 10G 光纤的数据实时采集、处理、传输。板 卡 采 用 Xilinx 的 …