首页 > 其他分享 >技术笔记(2)MMORPG架构

技术笔记(2)MMORPG架构

时间:2024-03-06 19:55:47浏览次数:26  
标签:eventRegistration 架构 void 笔记 onEvent MMORPG new 方法 public

技术笔记(2)MMORPG架构

  • 希望实现的功能或目标:

    • 一个功能完整的接近商业案例的MMORPG游戏项目
    • 搭建起该游戏项目的基本架构

  • 学习笔记:

    • IOCContainer类

      • 用以保存所有层级以及各个模块的实例

      • 实例字典

        • private Dictionary<Type,object> instancesDict = new Dictionary<Type,object>();​​
      • 注册方法

        •     public void Register<T>(T instance)
              {
                  var key = typeof(T);
                  if (instancesDict.ContainsKey(key))
                  {
                      instancesDict[key] = instance;
                  }
                  else
                  {
                      instancesDict.Add(key, instance);
                  }
              }
          
      • 获取实例方法

        • public T Get<T>() where T : class
          {
              var key = typeof(T);
              object obj = null;
              if(instancesDict.TryGetValue(key,out obj))
              {
                  return obj as T;
              }
              else
              {
                  Debug.Log("想要获取的对象为空");
              }
              return null;
          }
          
      • 调用容器所有实例初始化方法

        • public void InitAllModules()
          {
          
          }
          
    • EventRegistration类

      • 委托:public Action<object> OnEvent = obj => { };​​
    • GameEventSystem类

      • 事件字典:private Dictionary<Type, IEventRegistration> eventRegistrationsDict = new Dictionary<Type, IEventRegistration>();​​

      • 事件注册方法:

        • public void Regist<T>(Action<object> onEvent)
          {
              var type = typeof(T);
              IEventRegistration eventRegistration;
              if(eventRegistrationsDict.TryGetValue(type,out eventRegistration))
              {
                  (eventRegistration as EventRegistration).OnEvent += onEvent;
              }
              else
              {
                  eventRegistration = new EventRegistration() 
                  { 
                      OnEvent = onEvent
                  };
                  eventRegistrationsDict.Add(type, eventRegistration);
              }
          }
          
      • 事件发送方法:

        • public void Send<T>(object obj) where T : new()
          {
              var type = typeof(T);
              IEventRegistration eventRegistration;
              if (eventRegistrationsDict.TryGetValue(type, out eventRegistration))
              {
                  (eventRegistration as EventRegistration).OnEvent.Invoke(obj);
              }
          }
          
      • 事件注销方法:

        • public void UnRegist<T>(Action<object> onEvent)
          {
              var type = typeof(T);
              IEventRegistration eventRegistration;
              if (eventRegistrationsDict.TryGetValue(type, out eventRegistration))
              {
                  (eventRegistration as EventRegistration).OnEvent -= onEvent;
              }
          }
          
    • 架构抽象基类 abstract class Architecture

      • 实例化IOC容器:private IOCContainer IOCContainer = new IOCContainer();​​

      • 实例化游戏事件系统:private GameEventSystem gameEventSystem = new GameEventSystem();​​

      • 抽象初始化方法

        • protected abstract void Init();
          
      • 无参构造函数

        • public Architecture() { Init(); }
          
      • 初始化所有模块方法

        • public void InitAllModules()
          {
              IOCContainer.InitAllModules();
          }
          
      • 注册模型方法

        • public void RegistModel<U>(U instance) where U : IModel
          {
              IOCContainer.Register<U>(instance);
          }
          
      • 注册系统方法(同上)

      • 注册工具方法(同上)

      • 获取模型层对象方法

        • U IArchitecture.GetModel<U>()
          {
              return IOCContainer.Get<U>();
          }
          
      • 获取系统层对象方法(同上)

      • 获取工具层对象方法(同上)

      • 发送事件方法

        • public void SendEvent<U>(object dataObj) where U : new()
          {
              gameEventSystem.Send<U>(dataObj);
          }
          
      • 注册事件方法

        • public void RegistEvent<U>(Action<object> onEvent) where U : new()
          {
              gameEventSystem.Regist<U>(onEvent);
          }
          
      • 注销事件方法

        • public void UnRegistEvent<U>(Action<object> onEvent) where U : new()
          {
              gameEventSystem.UnRegist<U>(onEvent);
          }
          
      • 发送命令方法

        • public void SendCommand<U>(object dataObj) where U : ICommand, new()
          {
              var command = new U();
              command.Execute(dataObj);
          }
          

  • 实现过程中产生的疑惑:

    • public Action OnEvent = obj => { };
    • 为什么Architecture里面也要写事件的注册注销发送方法?
    • SendCommand(object dataObj)
    • Architecture的泛型T和IArchitecture的泛型U是什么关系
    • 为什么Architecture要做成抽象类?

  • 对疑惑的解答:

    • Action表示这个变量是一个Action类型的泛型委托,他可以指向一个接受一个object类型的参数,没有返回值的方法。
      obj=>{}表示这个变量的值是一个匿名方法,obj代表参数名称,{}表示方法体内容。

    • Architecture的事件相关方法,调用的其实还是事件系统里的方法,我个人的理解是在事件系统之上再套一层框架,用以和IOC联动,即统一由Architecture来管理和提供方法,避免我们直接访问事件系统类。

    • U表示这个方法的的泛型参数,它可以是任何实现了ICommand接口的类,比如MoveCommand、RotateCommand等。
      object dataObj表示这个方法的参数,它可以是任何类型的对象,它会作为命令的数据传递的命令的执行者。

    • 此处T和U的关系:

      • T表示继承自Architecture类的子类的类型,比如GameArchitecture、UIArchitecture等。
      • U表示不同的游戏模块或功能的类型,比如IModel、ISystem、IUtility、ICommand等。
    • 因为此处的Architecture类只是一个基类,还需要去实现继承自它的其他框架子类。

日期:3.4

标签:eventRegistration,架构,void,笔记,onEvent,MMORPG,new,方法,public
From: https://www.cnblogs.com/bqza000/p/18057407

相关文章

  • XXL-JOB 使用笔记(附代码)
    一:分布式调度系统对比开源产品对比:Quartz缺点: 1、不支持任务编排,无可视化编配页面 2、与业务高度耦合,系统侵入性严重 3.调度逻辑和QuartzJobBean耦合在同一个项目中,任务增加会导致系统性能瓶颈 4.quartz底层以“抢占式”获取DB锁并由抢占成功节点负责运行任务,会导......
  • 线性代数——平面向量 学习笔记
    线性代数——平面向量学习笔记首发于洛谷。定义及用语说明无特殊说明,下文的向量均指自由向量且是平面向量。向量,英文名为vector,目前没有准确而统一的中文翻译。在物理学科,一般翻译成「矢量」,且与「标量」一词相对。在数学学科,一般直接翻译成「向量」。对于向量的乘法:......
  • Vue学习笔记3--组件嵌套
    组件嵌套示例一:<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>非单文件组件--全局注册</tit......
  • NGUI学习笔记4.0
    EventListener和EventTrigger控件自带组件的局限性其实我们常见的复合控件只提供一些简单的事件监听,如按钮有点击抬起的监听,对长按等其他交互方式的事件监听不大支持。NGUI的监听函数给NGUI对象添加Collider,在其挂载的脚本中编写对应的NGUI的函数,在运行时候会通过反射来进行匹......
  • resurfaceio 参考架构
    resurfaceio是graylog开发的一个api安全解决方案,设计上使用了不少开源的东西,目前并不完全开源但是通过官方文档介绍,可以看到一些机制参考架构图简单说明:resurfaceio对于api安全的处理是通过三大方式解决的,第一中是基于sdk集成,写入请求信息到resurfaceioapi中第二种对......
  • Mybatis学习笔记
    Mybatis代码Mybatis入门https://mybatis.net.cn/getting-started.html写一个Mybatis项目1、新建一个Maven项目2、导入依赖集<!--导入依赖--><dependencies><!--mysql驱动--><dependency><groupId>mysql</groupId>......
  • pandas笔记(二)-- 从不订购的顾客 (数据表连接,主键与外键)
    题目描述找出所有从不点任何东西的顾客,以任意顺序返回结果测试用例输入Customerstable:idname1Joe2Henry3Sam4MaxOrderstable:idcustomerId1321输出CustomersHenryMax解析数据表连接的问题核心在于连接......
  • 数位DP 学习笔记
    什么是数位DP数位dp是与数字相关的一类计数问题。这这类问题中,一般给定一些限制条件,求满足第\(K\)小的数是多少,或者求区间\([L,R]\)内有多少个满足条件的数。本文主要讲述如何解决求区间\([L,R]\)内有多少个满足条件的数这一类问题。为什么要用数位dp对于上述问题,如果......
  • SimGRACE论文阅读笔记
    Abstract​ 图对比学习(GCL)已经成为图表示学习的一种主导技术,它最大限度地提高了共享相同语义的成对图增强之间的互信息。不幸的是,由于图数据的多样性,在扩充过程中很难很好地保存语义。目前,GCL的数据扩充大致可分为三种不令人满意的方式。第一,可以通过试错法手动选择每个数据集的......
  • 微服务架构,客户端如何捕捉服务端的异常?
    在微服务架构或者分布式系统中,客户端如何捕捉服务端的异常?这里说的客户端指调用方、服务端指被调用方,它们通常运行在不同的进程之中,这些进程可能运行在同一台服务器,也可能运行在不同的服务器,甚至不同的数据机房;其使用的技术栈可能相同,也可能存在很大的差异。为什么在Java、C#......