很多Unity3D项目都使用了UGUI,但并不是所有人都研究过它的内部结构。针对事件的传递过程,会问住大多数未深入思考过的开发者。由于UGUI是开源的,我们可以通过查看源码来熟悉它的原理,它的地址在可以找到。
事件体系
首先要说明,事件体系的基础是设计模式中的观察者模式,因此按照标准的Subject和Observer来解读没有任何问题。但在这里,我更希望以功能为导向,将事件体系划分成更易于理解的模块。按我的划分方式,事件体系由四部分组成,分别是:
- 监测器
- 采集器
- 派发器
- 响应器
这四个模块大致的依赖关系如下:
其中用户的操作被监测器驱动的采集器捕获,接着监测器将反馈的信息通知到派发器中,最后通过派发器将事件传播出去。
Unity3d 实现
在Unity3d中,功能模块的每个部分都有对应的实现类。
监测器(Monitor)对应类为EventSystem。它重写了MonoBehavior的Update方法,会在每一帧更新挂载在同一个GameObject上的采集器组件状态,并判断是否应该激活派发器,如果是,则去调用各个派发器中的派发函数Process。
采集器(Collector)由两部分组成,对应类分别为BaseInputModule和BaseRaycaster,在UGUI中默认使用的