unity3D技术分享

UGUI源码分析:EventSystem事件系统

2020-05-31  本文已影响0人  Vin129_

系列

UGUI源码分析系列总览

EventSystem

Related Class: BaseInputModule、BaseEventData、 ExecuteEvents、RaycasterManager+

Related Interface: 无

Related Other: 无

Intro: UGUI事件管理系统,通过此系统完成我们所知的UI交互。

基本使用:GameObject上挂有IEventSystemHandler组件并是可用状态

EventSystem:

管理 所有的输入检测模块(InputModule)并帧调用Module的执行(Process)

调动射线捕捉模块(Raycasters),为InputModule提供结果(具体的触点所穿透的对象信息)

InputModule 管理更新EventData 判断当前的操作事件,并通知具体的EventSystemHandler 进行逻辑处理

在这里插入图片描述

EventData

主要分三类来存储事件信息,对应具体的EventSystemHandler


BaseInputModule

被EventSystem帧调用,检查Input中各项数值 => 判断当前操作状态,更新/创建 PointerEventData并以当前操作状态进行组装 => Mouse : buttonData Touch : m_PointerData

主要分为单点触控(StandaloneInputModule)与多点触控(TouchInputModule Touch模块已经整合进Standalone中)模块。

ProcessMouseEvent

ProcessTouchEvents


Raycasters

在事件系统中充当捕获物体的角色,管理射线,为InputModule提供gameObject

RaycasterManager

管理了一个 RaycasterList,通过EventSystem.RaycastAll提供给InputModule

Physics2DRaycaster PhysicsRaycaster

由Manager触发射线(Raycast),返回射线结果(RaycastResult

2D与3D分别使用了Physics2D/Physics 中射线穿透获取交点信息的方法

Raycast的过程

RaycastResult

射线数据封装结构,包含了有关射线经过物体的具体信息

var castResult = new RaycastResult
{
    gameObject = go,//接收射线广播的物体
    module = this,//射线采集器Raycaster
    distance = distance,//最近距离
    screenPosition = eventPosition,//事件坐标(鼠标\触点坐标)
    index = resultAppendList.Count,//索引
    depth = m_RaycastResults[index].depth,//Graphic深度
    sortingLayer = canvas.sortingLayerID,
    sortingOrder = canvas.sortingOrder
};

EventSystemHandler

事件处理者,这里会提供许多事件接口。最终事件响应的具体逻辑就由我们继承这些接口来书写。

主要分为三种类型


ExecuteEvents

事件执行器,提供了一些通用的处理方法。

Execute过程:

GetEventList<T>(target, internalHandlers); 获取物体上所有包含IEventSystemHandler且可用的组件

arg = (T)internalHandlers[i]; 找到具体T类型组件

functor(arg, eventData); 执行

handler.OnXXXX(ValidateEventData<XXXXEventData>(eventData)); functor 类似这样

ExecuteHierarchy:逐节点寻找可执行的物体(含可用的IEventSystemHandler),触发(Execute)即停止逐根搜索,return


.
.
.
.
.


嗨,我是作者Vin129,逐儿时之梦正在游戏制作的技术海洋中漂泊。知道的越多,不知道的也越多。希望我的文章对你有所帮助:)


上一篇下一篇

猜你喜欢

热点阅读