返回

ET事件系统

ET的事件系统主要是理解EventSystem这个类的运作方式,下面开始介绍事件系统

工具类

  • ObjectHelper

    这个类只有静态方法,用于置换对象的引用路径。

  • UnOrderMultiMap<T, K>

    这个类可以理解为Dictionary与List融合的新结构体。

    在该类中 Dictionary<T, List> dictionary = new Dictionary<T, List>()是该类的核心。

    该类的主要作用是解决字典无法存储多个重复Value的问题。(为什么会出现重复Value,例如场景中有十个玩家也就是十个Unit,虽然他们是不同的是个单位,但是类名是相同的都是Unit,这也就是重复Value的由来)

核心成员类

  • 接口:IEvent、IAwakeSystem、IStartSystem、IDestroySystem、ILoadSystem、IUpdateSystem、ILateUpdateSystem、IChangeSystem、IDeserializeSystem
  • 特性:BaseAttribute、EventAttribute、ObjectSystemAttribute
  • 管理器:EventSystem

运作解析

InitSceneStart_CreateLoginUI是一个普通事件

UnitComponentSystem是一个组件事件;

Init类的StartAsync方法中我们可以看到调用了EventSystem的Add方法,在Add方法中通过遍历程序集将所有事件注册到容器中。

  • 第一步,将程序集中所有标识了特性(图中的[ObjectSystem])的类型(指UnitComponentSystem)保存到特性容器中;

  • 第二步,遍历特性容器中标识了ObjectSystemAttribute特性的类,将继承接口对象的组件类型(:AwakeSystem<UnitComponent>中的UnitComponent)保存到组件事件容器中;

  • 第三步,遍历特性容器中标识了EventAttribute特性的类,将特性类型参数([Event(EventIdType.InitSceneStart)]中的EventIdType.InitSceneStart)与类型(InitSceneStart_CreateLoginUI)保存到普通事件容器中

    需要注意的是,在hotfix的EventSystem中,会通过EventProxy类把热更层的事件也注册到mono层中

接下来我们看到EventSystem中的Add(Component component)方法,该方法会在组件生成时由组件工程调用。该方法通过组件事件容器,查找有没有该组件对应的事件,如果有就会将组件保存到对应的事件队列中,等待后续各种事件触发机制从队列中抛出事件。

有Add方法当然就会有对应的Remove方法,调用Remove方法则会将该组件对应的事件从事件队列中移除。

事件抛出机制

  • Deserialize方法:反序列化抛出,由Component.EndInit函数调用
  • Awake方法:组件生成时抛出,由ComponentFactory调用
  • Change方法:修改组件抛出,由用户手动调用
  • Load方法:加载Dll时抛出,由EventSystem.Add函数调用
  • Start方法:Update调用前抛出,由EventSystem.Update函数调用
  • Destroy方法:组件销毁时抛出,由Component.Dispose函数调用
  • Update方法:每帧抛出,由Init.Update函数调用
  • LateUpdate方法:Update后抛出,由Init.LateUpdate函数调用
  • Run方法:普通事件抛出函数,由用户手动调用
Licensed under CC BY-NC-SA 4.0
0