事件系统
ET的事件系统主要是理解EventSystem这个类的运作方式,下面开始介绍事件系统
工具类
-
ObjectHelper
这个类只有静态方法,用于置换对象的引用路径。
-
UnOrderMultiMap<T, K>
这个类可以理解为Dictionary与List融合的新结构体。
在该类中 Dictionary<T, List<K>> dictionary = new Dictionary<T, List<K>>()是该类的核心。
该类的主要作用是解决字典无法存储多个重复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方法:普通事件抛出函数,由用户手动调用
网友评论