UGUI内核大探究(一)EventSystem我们探究了事件系统,其中我们讲到EventSystem可以通过ExecuteEvents这个类来执行事件,那么事件是如何执行的呢?这里涉及到了两个文件EventInterface和ExecuteEvents。

按照惯例,附上UGUI源码下载地址。

EventInterface声明了一系列interface(可以参考我之前的博客关于接口的介绍),如果经常接触UI的话,我相信你对这些接口一定不陌生。例如IPointerEnterHandler(指针进入事件接口)。一个组件添加这个接口的继承之后,再实现OnPointerEnter方法,便可以接收到指针进入事件,也就是当鼠标滑入对象所在的区域之后,便会回调OnPointerEnter方法。这些接口全都继承自IEventSystemHandler,而后者也是声明在EventInterface里的接口。

以上这些接口都会在ExecuteEvents里被调用。ExecuteEvents类是个静态类,不能被实例化,所有的公共方法都通过ExecuteEvents.XXXX来调用。ExecuteEvents里声明了一个delegate的类型(可以参考我之前的博客关于委托的介绍)EventFunction,这是一个泛型委托,委托的第一个参数handler可以是不同的类型。然后对EventInterface里除了IEventSystemHandler外每一个接口声明了一个EventFunction类型的委托变量和方法。例如:

        private static readonly EventFunction<IPointerEnterHandler> s_PointerEnterHandler = Execute;private static void Execute(IPointerEnterHandler handler, BaseEventData eventData){handler.OnPointerEnter(ValidateEventData<PointerEventData>(eventData));}

就是声明了一个参数类型为IPointerEnterHandler的委托变量s_PointerEnterHandler,并实现了委托所执行的方法Execute。

然后又声明了一系列属性,这些属性是获取上述委托变量的只读属性,用于在外部调用。

而外部统一调用执行事件的方法是

public static bool Execute<T>(GameObject target, BaseEventData eventData, EventFunction<T> functor) where T : IEventSystemHandler

我们先看一下它的使用方法,例如在BaseInputModule里,我们看到:

ExecuteEvents.Execute(t.gameObject, currentPointerData, ExecuteEvents.pointerEnterHandler);

前两个参数很好理解,第三个参数就是调用了ExecuteEvents里的pointerEnterHandler属性(也就是上面的s_PointerEnterHandler),这样泛型T也就变成了IPointerEnterHandler。

Execute方法里面,通过GetEventList获得target上的T类型的组件列表,然后遍历这些组件,并执行

functor(arg, eventData);

以pointerEnterHandler为例,我们可以了解这个方法实际上执行的是:

arg.OnPointerEnter(ValidateEventData<PointerEventData>(eventData));

也就是调用了IPointerEnterHandler类型的组件的OnPointerEnter方法。

至此,我们就了解到了UGUI里的事件是如何执行的:指定某个接口类型,由Execute方法调用目标对象的接口方法。

接着,补充一下ExecuteEvents类里面其他方法的介绍。

ExecuteHierarchy方法会通过GetEventChain获取target的所以父对象,并对这些对象(包括target)执行Execute方法。
GetEventHandler会遍历目标对象及其父对象,判断他们是否包含某个指定接口,如果包含则作为返回值返回。而判断方法是CanHandleEvent,通过GetEventList方法获取target上的T类型的组件列表,判断列表数量不为零。GetEventHandler主要在输入模块里被调用,用于获取某个输入事件的响应对象。(详细分析会在后续的文章中介绍)

UGUI内核大探究(二)执行事件相关推荐

  1. UGUI内核大探究(十二)Slider

    Slider是UGUI的一个组件,使用它可以实现滑动条,算是一个比较常用的组件,它与ScrollBar(参考UGUI内核大探究(十一)ScrollRect与ScrollBar)有些类似,但又不太相同. ...

  2. UGUI内核大探究(十六)InputField

    InputField是UGUI的重要组件,可以提供文本输入功能,是与用户交互的一个重要手段.我们可以在编辑器里,为OnValueChanged和OnEndEdit两个事件添加监听,这样就可以获得用户输 ...

  3. UGUI内核大探究(八)MaskableGraphic

    MaskableGraphic是UGUI的核心组件,它继承自Graphic.MaskableGraphic是一个抽象类,它的派生类有RawImage.Image.Text.顾名思义,MaskableG ...

  4. UGUI内核大探究(十三)Dropdown

    Dropdown(下拉框)可谓是UGUI的集大成者,在Unity Editor里新建一个Dropdown,会随之附赠Text(Label对象).Image(Arrow对象).ScrollRect(Te ...

  5. UGUI内核大探究(十一)ScrollRect与ScrollBar

    当我们在Unity Editor里创建一个Scroll View的时候含有ScrollRect的对象,它下面还有三个子对象,两个含有ScrollBar组件的子对象是作为滚动条,一个Viewport用于 ...

  6. UGUI内核大探究(九)Image与RawImage

    Image组件是UGUI里最常用的组件(可能没有之一),我们知道其实还有一个RawImage组件.那么二者的区别是什么呢?之前的文章UGUI内核大探究(八)MaskableGraphic中我们提到过, ...

  7. UGUI内核大探究(十八)Raycaster

    射线其实是属于事件系统,它在EventSystem/Raycasters目录下,有BaseRaycaster.PhysicsRaycaster和Physics2DRaycaster三个类,命名空间也是 ...

  8. UGUI内核大探究(一)EventSystem

    2019独角兽企业重金招聘Python工程师标准>>> UGUI是Unity3D官方推出的UI系统,为了更好的使用UGUI,我们就需要去了解它. UGUI代码开源,我们可以从bitb ...

  9. 神经网络损失函数特别大_二值神经网络(Binary Neural Networks)最新综述

    作者|秦浩桐.龚睿昊.张祥国 单位|北京航空航天大学 研究方向|网络量化压缩 本文介绍了来自北京航空航天大学刘祥龙副教授研究团队的最新综述文章 Binary Neural Networks: A Su ...

最新文章

  1. 去除VisualStudio中拼写错误检测的红色波浪线
  2. iOS之深入解析渲染的底层原理
  3. C语言 PK 各大编程语言
  4. pygame游戏开发入门例子
  5. orchard学习,
  6. 千行代码入门python-要学 Python 需要怎样的基础?
  7. 基于python的微博舆情分析与研究—以《北京冬奥会》为关键词
  8. cmd格式化(重置)磁盘/U盘的操作流程
  9. handsontable+vue+ 自定义多选
  10. C语言六边形蜂巢数组,CSS 实现蜂巢/六边形图集
  11. PPT怎么用100张照片做照片墙?
  12. 七堂思维成长课-读后感
  13. 笔画输入法教程――如何学习笔画输入法
  14. OTFS白皮书-翻译
  15. 如何从零开始搭建直播平台,从flash时代的rtmp到过渡期的flv和webrtc的未来以及简单聊聊webassmbly
  16. windows下如何下载android源码
  17. 嵌入式作业STM32采用串口DMA方式发送数据
  18. 下载HTG摄影备忘单(钱包大小!)
  19. Chained Predictions Using Convolutional Neural Networks
  20. boss直聘__zp_stoken__逆向分析2021.10版

热门文章

  1. 修改el-Badge 标记 content的位置
  2. Pytorch踩坑记录:关于用net.eval()和with no grad装饰器计算结果不一样的问题
  3. 移动端车架号vin码识别SDK
  4. vue-draggable-resizable定制化可拖动控件
  5. Python数据分析项目案例
  6. Win7 提示“请考虑更换电池”
  7. activemq 管理后台 Number Of Pending Messages、Number Of Consumers、Messages Enqueued、Messages Dequeued的意思
  8. java 日食还是月蚀,2018年日食和月食时间
  9. 软件测试知识点(持续更新)
  10. 宅基地信息管理系统、审批监管平台