首页 > 其他分享 >Unity QFrameWork--Architecture

Unity QFrameWork--Architecture

时间:2025-01-15 14:23:33浏览次数:1  
标签:-- mArchitecture void QFrameWork instance Unity new where public

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 的 API
        public 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);
                
                // 初始化 Model
                foreach (var architectureModel in mArchitecture.mModels)
                {
                    architectureModel.Init();
                }

                // 清空 Model
                mArchitecture.mModels.Clear();
                
                // 初始化 System

                foreach (var architectureSystem in mArchitecture.mSystems) // 新增
                {
                    architectureSystem.Init();
                }
                
                // 清空 System
                mArchitecture.mSystems.Clear(); // 新增
                
                mArchitecture.mInited = true;
            }
        }

        #endregion

        private IOCContainer mContainer = new IOCContainer();

        // 留给子类注册模块
        protected abstract void Init();

        // 提供一个注册模块的 API
        public 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>();
        }

        // 提供一个获取模块的 API
        public 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>(); // 触发事件

标签:--,mArchitecture,void,QFrameWork,instance,Unity,new,where,public
From: https://www.cnblogs.com/Z-wzy/p/18672900

相关文章

  • UNI-APP + Spring Boot 实现小程序手机号登录
    以下是整合后的完整方案,结合了UNI-APP前端和JavaSpringBoot后端,实现小程序手机号登录功能:1.前端实现:获取用户手机号并调用登录接口在UNI-APP中,使用button​组件获取用户的手机号授权,并将授权后的code​发送到后端登录接口。1.1前端代码<template><......
  • diesel操作sqlite
    diesel={version="*",features=["sqlite","r2d2"]}diesel_derives={version="*",features=["sqlite"]}lazy_static="*"[build-dependencies]diesel_cli={version="*",......
  • 线段树【区间GCD】
    https://codeforces.com/contest/2050/problem/F#include<bits/stdc++.h>#definelcp<<1#definercp<<1|1#defineINF2e9usingnamespacestd;#definelowbit(x)x&(-x)#defineendl'\n'usingll=longlong;usingpii=pair......
  • jenkins集成多版本maven打包
    默认版本maven和jdk                             mvn高版本部署      1.用低版本的mvn和jdk编译高版本项目的时候提示错误                2.查看项目的pom.xml文件查看项......
  • 如何处理网站内容被删除并恢复数据库文件的问题
    用户反馈其网站内容被删除,希望恢复特定日期(如4月13日)的数据库备份文件。这可能是由于恶意攻击、误操作或其他未知原因引起的。解决方案确认备份情况登录到托管服务提供商的管理面板,查看是否有可用的备份文件。特别关注指定日期(如4月13日)的备份。如果发现备份文件缺失或损坏......
  • Markdown-study
    Markdown-study标题一级标题一个#二级标题两个#三级标题三个#字体粗体左右两个*斜体左右一个*横线左右两个~引用一个>+空格即可分割线三个-或者三个*图片![图片](路径)超链接点击跳转列表数字+空格B减-+空格B表格右键插入即可......
  • 如何解决服务器环境下强制删除文件或文件夹提示找不到该项目的问题?
    在服务器环境中,有时会遇到无法通过常规方法(如改名或使用 del 命令)删除文件或文件夹的情况。系统可能会提示“找不到该项目”,或者删除操作没有任何提示和响应。这通常是由于文件或文件夹被占用、权限问题、路径过长或其他系统级限制所引起的。为了解决这个问题,可以创建一个批处......
  • 如何解决定义了重复的 "system.web.extensions/scripting/scriptResourceHandler" 节
    问题描述在使用ASP.NET应用程序时,可能会遇到配置文件中定义了重复的 "system.web.extensions/scripting/scriptResourceHandler" 节的问题。这通常会导致应用程序无法正常启动或运行,并抛出配置错误。此问题的具体表现形式是:当尝试访问网站时,会收到一个配置错误提示,指出存在重复......
  • 云服务器 CPU 占用率 100% 的原因和解决办法
    当云服务器的CPU占用率达到100%时,不仅会导致运行在服务器上的应用程序响应缓慢,还可能造成远程无法登录,甚至导致服务器宕机。以下是几种常见的原因及其解决办法:1.被入侵或成为肉鸡原因: 服务器可能被黑客入侵,成为肉鸡用于对外扫描或发送数据包,从而导致CPU占用率异常升高。......
  • 宝塔面板安装应用时一直显示等待执行状态
    在使用宝塔面板安装应用时,有时会遇到安装任务长时间停留在“等待执行”状态的情况。这可能是由于多种原因导致的,包括浏览器缓存问题、面板服务异常等。以下是一些解决该问题的步骤和建议。解决步骤清理浏览器缓存清理浏览器的缓存和Cookies,确保没有旧的数据干扰面板的正常运......