UGUI 源码解读-EventSystem
2021/5/23 20:26:04
本文主要是介绍UGUI 源码解读-EventSystem,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
EventSystem事件系统的源码目录结构如下:大致可分为EventData、InputModules、Raycasters、EventSystem、ExecuteEvents。
EventSystem的职责:
- 管理和处理输入事件(InputModule)
- 调用Raycaster发起射线检测,获取输入事件投射到的物体
- 将事件发送给投射物体处理。
每个场景一般有且只有一个EventSystem,EventSystem上一般会挂一个InputModule模块。
EventData
- BaseEventData:基础的事件信息,持有EventSystem
-
PointerEventData: 继承于BaseEventData,存储 触摸/点击/鼠标操作 事件信息,部分信息如下:
-
AxisEventData:继承于BaseEventData,移动相关的事件信息。
InputModules
-
BaseInput, 封装了触摸和鼠标的相关事件获取。
-
BaseInputModule ,所有InputModule的基类,抽象函数
public abstract void Process();
,持有EventSystem,EventData,BaseInput。OnEnable中调用EventSystem#UpdateModules注册输入模块。
EventSystem的Update函数中,先通过TickModules调用InputModule的UpdateModule函数,然后调用Process函数分发事件。
-
PointerInputModule,继承于BaseInputModule,封装了一些工具函数,比如
GetTouchPointerEventData
用于将Touch转为EventData,GetMousePointerEventData
用于将鼠标点击事件转为MouseState(MouseState存放着三个鼠标按钮的事件数据)。 -
StandaloneInputModule,继承于PointerInputModule,Process函数中,先调用ProcessTouchEvents处理触摸事件,如果没有触摸事件则调用ProcessMouseEvent处理鼠标事件。
Raycasters
在事件系统中充当捕获物体的角色,管理射线,为InputModule提供GameObject
-
BaseRaycaster, 所有Raycaster的基类,OnEnable中向RaycasterManager注册,
Raycast
函数通过PointerEventData
获取射线结果List<RaycastResult>
。public abstract void Raycast(PointerEventData eventData, List<RaycastResult> resultAppendList);
-
GraphicRaycaster, 见名知意,用于获取挂有Graphic脚本的GameObject,Graphic是UGUI比较重要的概念,Image、RawImage、Text等凡是需要Mesh渲染的UI都必须继承于它。
被射线检测到的结果会包装成RaycastResult返回:
什么时候会发起射线检测?
EventSystem中有一个RaycastAll函数,依次调用Raycast
函数发起射线检测。
在BaseInputModule的GetTouchPointerEventData
和GetMousePointerEventData
函数中通过eventSystem.RaycastAll开始射线检测。
protected PointerEventData GetTouchPointerEventData(Touch input, out bool pressed, out bool released) { PointerEventData pointerData; var created = GetPointerData(input.fingerId, out pointerData, true); //....省略部分代码 if (input.phase == TouchPhase.Canceled) { pointerData.pointerCurrentRaycast = new RaycastResult(); } else { //发起射线检测 eventSystem.RaycastAll(pointerData, m_RaycastResultCache); var raycast = FindFirstRaycast(m_RaycastResultCache); pointerData.pointerCurrentRaycast = raycast; m_RaycastResultCache.Clear(); } return pointerData; } protected virtual MouseState GetMousePointerEventData(int id) { // Populate the left button... PointerEventData leftData; var created = GetPointerData(kMouseLeftId, out leftData, true); //....省略部分代码 //发起射线检测 eventSystem.RaycastAll(leftData, m_RaycastResultCache); var raycast = FindFirstRaycast(m_RaycastResultCache); leftData.pointerCurrentRaycast = raycast; m_RaycastResultCache.Clear(); //....省略部分代码 return m_MouseState; }
EventSystemHandler
被射线检测到的GameObject不一定直接参与事件处理,一般会检测当前物体或者其父物体上的脚本是否实现了IEventSystemHandler接口。
public interface IPointerEnterHandler : IEventSystemHandler { /// <summary> /// Use this callback to detect pointer enter events /// </summary> void OnPointerEnter(PointerEventData eventData); }
接口主要分为三大类:
- IPointerXXXHandler : 处理鼠标点击和触屏事件
- IDragXXXXHandler:处理拖拽事件
- IXXXHandler:处理其他如选择、取消等事件
ExecuteEvents
事件执行器,封装了事件执行相关的逻辑。
-
GetEventHandler ,用于获取实现了对应接口的GameObject
-
Execute, 获取物体身上的所有IEventSystemHandler脚本,依次执行事件函数
- ExecuteHierarchy,逐节点寻找可执行的物体(含可用的IEventSystemHandler),触发(Execute)即停止逐根搜索。
详细执行过程可看ProcessTouchEvents和ProcessMouseEvent两个函数的逻辑。
这篇关于UGUI 源码解读-EventSystem的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23Springboot应用的多环境打包入门
- 2024-11-23Springboot应用的生产发布入门教程
- 2024-11-23Python编程入门指南
- 2024-11-23Java创业入门:从零开始的编程之旅
- 2024-11-23Java创业入门:新手必读的Java编程与创业指南
- 2024-11-23Java对接阿里云智能语音服务入门详解
- 2024-11-23Java对接阿里云智能语音服务入门教程
- 2024-11-23JAVA对接阿里云智能语音服务入门教程
- 2024-11-23Java副业入门:初学者的简单教程
- 2024-11-23JAVA副业入门:初学者的实战指南