UGUI事件传递流程解析
很多Unity3D项目都使用了UGUI,但并不是所有人都研究过它的内部结构。针对事件的传递过程,会问住大多数未深入思考过的开发者。由于UGUI是开源的,我们可以通过查看源码来熟悉它的原理,它的地址在可以找到。
事件体系
首先要说明,事件体系的基础是设计模式中的观察者模式,因此按照标准的Subject和Observer来解读没有任何问题。但在这里,我更希望以功能为导向,将事件体系划分成更易于理解的模块。按我的划分方式,事件体系由四部分组成,分别是:
- 监测器
- 采集器
- 派发器
- 响应器
这四个模块大致的依赖关系如下:
其中用户的操作被监测器驱动的采集器捕获,接着监测器将反馈的信息通知到派发器中,最后通过派发器将事件传播出去。
Unity3d 实现
在Unity3d中,功能模块的每个部分都有对应的实现类。
监测器(Monitor)对应类为EventSystem。它重写了MonoBehavior的Update方法,会在每一帧更新挂载在同一个GameObject上的采集器组件状态,并判断是否应该激活派发器,如果是,则去调用各个派发器中的派发函数Process。
采集器(Collector)由两部分组成,对应类分别为BaseInputModule和BaseRaycaster,在UGUI中默认使用的是它们的子类StandaloneInputModule和GraphicRaycaster。当用户操作时,会先由BaseInputModule激活模块,然后发出一个射线点触,返回在BaseRayCaster中能点到的物体并返回信息,交由派发器进行过滤。所以采集器有两端,连接它们要靠EventSystem。整个过程中还有一个静态内部的管理类RaycasterManager,用来做连接采集器和监测器的数据桥梁。
派发器(Dispatcher)对应类也为BaseInputModule,最常用的是它的子类StandaloneInputMoudle,这时该类的角色与采集器混在了一起。派发器完成了实际的事件生成。包括且不限于:事件类型的确定,事件内容的提取,派发对象的过滤。其中对派发对象的获取需要借助采集器,但需要通过监测器来驱动。这种设计可以带来效率上的优势,即可以合并采集操作,以达到降低事件频率的目的。
响应器(Receiver)对应类为IEventSystemHandler及其子类,例如最常用的IPointerClickHandler,它的作用是处理点击事件。通过ExecuteEvents类,可以将发生事件的对象上所有的响应器都获取到并调用其响应逻辑。以点击为例,事件最终会被派发到OnClick的代理上。完成逻辑的执行。
类图
相关实现类有好多,大体分两部分,一部分是功能类,一部分是编辑器类。
功能类按照上一小结的事件体系可以清晰的找到重要的基类,他们的UML图如下:
这个图只是和点击相关的部分,当然还有很多其他的功能例如拖拽,滑动等等。不过如果能找到这些重点,其他逻辑相信大家可以结合代码自行推导。本文内容出自《游戏架构:核心技术与面试精粹》,感兴趣的读者可以在主流电商网站上查到。
另一类是编辑器类,这个比较简单,我就没单独梳理类图,直接用VS自动生成的类图就够用了:
值得一提的是,UGUI的编辑器界面做的很细致,用起来也很方便。因此当我们需要自定义Inspector界面时,编辑器代码中一些功能的实现具有参考价值。
总结
如果还是对点击事件的流程不是很清楚,可以参考我绘制的按钮点击消息传递的调用流程,具体图如下\
本文出自我的编写的书:
主流电商网站有售:
- 京东
- 淘宝
- 当当
- china-pub
UGUI事件传递流程解析相关推荐
- Android webkit 事件传递流程
前言:基于android webview 上定制自己使用的可移植浏览器apk,遇到好多按键处理的问题.所以索***了一下keyevent 事件的传递流程. frameworks 层 keyevent ...
- Android Touch事件传递机制解析 (推荐)
最近新闻列表里的下拉 down up move 等等让我十分头疼 ,无意间看到了一篇非常不错的帖子,转载如下: 开篇语:最近程序在做一个小效果,要用到touch,结果整得云里面雾里的,干脆就好好把a ...
- TvInput Cec key事件传递流程
一.TV应用MainActivity 1.dispatchInputEvent 这里会特殊处理back键,只有Home键才会退出TV应用,back键会传递给cec连接的device处理.如果按键不在黑 ...
- android touch事件坐标原点,图解Android:Touch事件传递机制
前言 Android事件管理机制是一名专业Android研发工程师必须要了解的核心知识之一,深入了解一下该机制无论对我们日常开发还是找工作,乃至于对我们的架构思想都有很大的帮助.Android中我们用 ...
- Android事件传递可以这样理解
前言 关于Android中事件传递机制早已是老生常谈的话题,甭管工作多久水平咋样应该都能道出一二.依稀记得刚接触事件分发那会,一股脑的钻进网络上那几张神图,什么三大方法.职责链,最后再巴拉巴拉贴一大堆 ...
- Android自定义View2--触摸事件传递机制
转载文章 :https://juejin.im/post/6844904041487532045#heading-6 https://juejin.im/post/684490389410388378 ...
- Android 事件传递机制总结
Android 事件传递机制总结 Android View虽然不是四大组件,但是其重要程度堪比四大组件.初级工程师到中高级工程师,这些都是很重要的,因为事件分发机制面试也会经常被提及,如果我们能get ...
- Android面试必问之触摸事件传递机制
Android面试必问之触摸事件传递机制 一.Activity的构成 二.触摸事件的类型 三.事件传递的三个阶段 Activity对点击事件的分发过程 五.View的事件分发机制 六.点击事件分发的传 ...
- iOS之深入解析事件传递的响应链
一.UIResponder App 使用响应者对象接收和处理事件,只有继承 UIResponder 的类,才能处理事件. UIApplication.UIView.UIViewController 都 ...
最新文章
- python医学科研中能做什么-非结构化数据-病历智能处理引擎的设计、实现和应用...
- SringIOC中Bean的后置处理器
- 3ds Max 2018 在安装后无法启动或出现不稳定
- Redis 6.0 新特性 ACL 介绍
- slot多作用域 vue_详解Vue.js 作用域、slot用法(单个slot、具名slot)
- C++文件操作与文件流
- java rsa padding_rsa加密--选择padding模式需要注意的问题。。。
- std::locale与boost::locale的学习
- 托物言志--在心为志,发言为诗。
- 什么时候你想逃离北上广?
- SourceTree和Bitbucket使用时的注意事项
- shell脚本——注释(单行注释 多行注释)
- 编程初学者的4大网站(免费)
- 书籍特别推荐:2018-06薛兆丰经济学讲义+魔鬼经济学(四本)
- Windows PowerShell简介
- MySQL通用函数汇总大全
- easypr arm linux,arm linux下交叉編譯EasyPR中文車牌識別系統開發(一)
- 【 Rust 基础】控制流 —— Rust 的神级语法03
- NLPCC 2023 Shared Task 5:中文医疗教学视频问答任务
- 红旗linux系统服务器,红旗linux11系统