很多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事件传递流程解析相关推荐

  1. Android webkit 事件传递流程

    前言:基于android webview 上定制自己使用的可移植浏览器apk,遇到好多按键处理的问题.所以索***了一下keyevent 事件的传递流程. frameworks 层 keyevent ...

  2. Android Touch事件传递机制解析 (推荐)

    最近新闻列表里的下拉 down up  move 等等让我十分头疼 ,无意间看到了一篇非常不错的帖子,转载如下: 开篇语:最近程序在做一个小效果,要用到touch,结果整得云里面雾里的,干脆就好好把a ...

  3. TvInput Cec key事件传递流程

    一.TV应用MainActivity 1.dispatchInputEvent 这里会特殊处理back键,只有Home键才会退出TV应用,back键会传递给cec连接的device处理.如果按键不在黑 ...

  4. android touch事件坐标原点,图解Android:Touch事件传递机制

    前言 Android事件管理机制是一名专业Android研发工程师必须要了解的核心知识之一,深入了解一下该机制无论对我们日常开发还是找工作,乃至于对我们的架构思想都有很大的帮助.Android中我们用 ...

  5. Android事件传递可以这样理解

    前言 关于Android中事件传递机制早已是老生常谈的话题,甭管工作多久水平咋样应该都能道出一二.依稀记得刚接触事件分发那会,一股脑的钻进网络上那几张神图,什么三大方法.职责链,最后再巴拉巴拉贴一大堆 ...

  6. Android自定义View2--触摸事件传递机制

    转载文章 :https://juejin.im/post/6844904041487532045#heading-6 https://juejin.im/post/684490389410388378 ...

  7. Android 事件传递机制总结

    Android 事件传递机制总结 Android View虽然不是四大组件,但是其重要程度堪比四大组件.初级工程师到中高级工程师,这些都是很重要的,因为事件分发机制面试也会经常被提及,如果我们能get ...

  8. Android面试必问之触摸事件传递机制

    Android面试必问之触摸事件传递机制 一.Activity的构成 二.触摸事件的类型 三.事件传递的三个阶段 Activity对点击事件的分发过程 五.View的事件分发机制 六.点击事件分发的传 ...

  9. iOS之深入解析事件传递的响应链

    一.UIResponder App 使用响应者对象接收和处理事件,只有继承 UIResponder 的类,才能处理事件. UIApplication.UIView.UIViewController 都 ...

最新文章

  1. python医学科研中能做什么-非结构化数据-病历智能处理引擎的设计、实现和应用...
  2. SringIOC中Bean的后置处理器
  3. 3ds Max 2018 在安装后无法启动或出现不稳定
  4. Redis 6.0 新特性 ACL 介绍
  5. slot多作用域 vue_详解Vue.js 作用域、slot用法(单个slot、具名slot)
  6. C++文件操作与文件流
  7. java rsa padding_rsa加密--选择padding模式需要注意的问题。。。
  8. std::locale与boost::locale的学习
  9. 托物言志--在心为志,发言为诗。
  10. 什么时候你想逃离北上广?
  11. SourceTree和Bitbucket使用时的注意事项
  12. shell脚本——注释(单行注释 多行注释)
  13. 编程初学者的4大网站(免费)
  14. 书籍特别推荐:2018-06薛兆丰经济学讲义+魔鬼经济学(四本)
  15. Windows PowerShell简介
  16. MySQL通用函数汇总大全
  17. easypr arm linux,arm linux下交叉編譯EasyPR中文車牌識別系統開發(一)
  18. 【 Rust 基础】控制流 —— Rust 的神级语法03
  19. NLPCC 2023 Shared Task 5:中文医疗教学视频问答任务
  20. 红旗linux系统服务器,红旗linux11系统

热门文章

  1. 日历农历vue包括24节气等内容
  2. mc服务器常用指令_掌控MC服务器 我的世界服务器指令大全
  3. Allegro Layout常用功能
  4. Ingress基本故障排除方法
  5. 蓝牙 aptx android,蓝牙aptx干嘛用的
  6. 本地局域网HTTPS解决方案 CA证书
  7. 磁共振检查头部能检测出什么_头部核磁共振可以检查什么?
  8. cajviewer打不开,卸载重装也于事无补。一分钟解决,亲测有效。
  9. 华为高管又出事了!涉嫌受贿被带走!拿着几百万年薪,为啥还要贪?
  10. (四)Python小甲鱼入门教程笔记——思维导图训练