学习参考

从bitbucket上获取uGUI 2019.1源码

UGUI内核大探究

事件系统

UnityEngine.UI/EventSystem/EventSystem.cs

private List<BaseInputModule> m_SystemInputModules = new List<BaseInputModule>(); // 系统输入模块列表
private BaseInputModule m_CurrentInputModule; // 当前输入模块

事件的执行

UnityEngine.UI/EventSystem/EventInterfaces.cs
EventSystem可以通过ExecuteEvents类执行事件,那么事件是如何执行的呢?这里涉及到了两个文件EventInterface和ExecuteEvents。
EventInterface声明了一系列interface,例如IPointerEnterHandler(指针进入事件接口)。一个组件添加这个接口的继承之后,再实现OnPointerEnter方法,便可以接收到指针进入事件,也就是当鼠标滑入对象所在的区域之后,便会回调OnPointerEnter方法。

UnityEngine.UI/EventSystem/ExecuteEvents.cs
ExecuteEvents类是个静态类,不能被实例化,所有的公共方法都通过ExecuteEvents.XXXX来调用。EventInterface提供的接口都会在ExecuteEvents里被调用。
ExecuteEvents里声明了一个delegate的类型EventFunction,这是一个泛型委托,委托的第一个参数handler可以是不同的类型。然后对EventInterface里除了IEventSystemHandler外每一个接口声明了一个EventFunction类型的委托变量和方法。

private static readonly EventFunction<IPointerEnterHandler> s_PointerEnterHandler = Execute;

事件的产生

BaseInputModule是一个抽象类,是所有输入模块类的基类。PointerInputModule也是一个抽象类,继承自BaseInputModule,是StandaloneInputModule和TouchInputModule的基类。而StandaloneInputModule是在PC、Mac&Linux上的具体实现,而TouchInputModule是在IOS、Android等移动平台上的具体实现。之所以这种继承结构,我认为是向开发者提供了扩展,方便开发者实现新型设备的输入模块。

当鼠标或触摸进入、退出当前对象时执行pointerEnterHandler、pointerExitHandler。

在鼠标或者触摸按下、松开时执行pointerDownHandler、pointerUpHandler。

在鼠标或触摸松开并且与按下时是同一个响应物体时执行pointerClickHandler。

在鼠标或触摸位置发生偏移(偏移值大于一个很小的常量)时执行beginDragHandler。

在鼠标或者触摸按下且当前对象可以响应拖拽事件时执行initializePotentialDrag。

对象正在被拖拽且鼠标或触摸移动时执行dragHandler。

对象正在被拖拽且鼠标或触摸松开时执行endDragHandler。

鼠标或触摸松开且对象未响应pointerClickHandler情况下,如果对象正在被拖拽,执行dropHandler。

当鼠标滚动差值大于零执行scrollHandler。

当输入模块切换到StandaloneInputModule时执行updateSelectedHandler。(不需要Input类)

当鼠标移动导致被选中的对象改变时,执行selectHandler和deselectHandler。

导航事件可用情况下,按下上下左右键,执行moveHandler,按下确认键执行submitHandler,按下取消键执行cancelHandler。

画布更新

UnityEngine.UI/UI/Core/CanvasUpdateRegistry.cs

核心组件

UGUI组件都继承自UIBehaviour

UnityEngine.UI/UI/Core/Selectable.cs

Selectable是UGUI的核心组件,除了最常用的Button,它还是Scrollbar、Dropdown、Slider、Toggle、InputField这些组件的基类。
Button继承自Selectable并额外继承了IPointerClickHandler、ISubmitHandler两个接口。它还添加了一个UnityEvent类型的事件onClick。onClick事件可以添加用户自定义的监听,具体方法可以通过编辑器添加也可以通过onClick.AddListener添加。

Button就是相对于Selectable添加了响应点击和确认事件的接口,并且开放了可添加用户自定义监听的onClick事件。

而Selectable的作用在于提供了基于鼠标事件的四种状态变化。一方面,为Button、Dropdown等派生类提供了基础的逻辑,另一方面,我们也可以根据Selectable派生出新的自定义组件。

UnityEngine.UI/UI/Core/Button.cs 按钮
UnityEngine.UI/UI/Core/Toggle.cs 开关

UnityEngine.UI/UI/Core/Graphic.cs 图像

UnityEngine.UI/UI/Core/ScrollRect.cs 滚动区域
UnityEngine.UI/UI/Core/Scrollbar.cs 滚动条
UnityEngine.UI/UI/Core/Slider.cs 滑动条

UnityEngine.UI/UI/Core/Dropdown.cs 下拉框
UnityEngine.UI/UI/Core/.cs 文本
UnityEngine.UI/UI/Core/InputField.cs 输入框
UnityEngine.UI/UI/Core/VertexModifiers/Shadow.cs 阴影
UnityEngine.UI/UI/Core/VertexModifiers/Outline.cs 轮廓

[源码学习]--UGUI相关推荐

  1. GameFramework源码学习(一)

    GameFramework源码学习(一) 文章目录 一.GameFrameWork是什么? 二.框架学习 1.框架入口 2.UI模块初步了解 一.GameFramework是什么? GameFrame ...

  2. Shiro源码学习之二

    接上一篇 Shiro源码学习之一 3.subject.login 进入login public void login(AuthenticationToken token) throws Authent ...

  3. Shiro源码学习之一

    一.最基本的使用 1.Maven依赖 <dependency><groupId>org.apache.shiro</groupId><artifactId&g ...

  4. mutations vuex 调用_Vuex源码学习(六)action和mutation如何被调用的(前置准备篇)...

    前言 Vuex源码系列不知不觉已经到了第六篇.前置的五篇分别如下: 长篇连载:Vuex源码学习(一)功能梳理 长篇连载:Vuex源码学习(二)脉络梳理 作为一个Web前端,你知道Vuex的instal ...

  5. vue实例没有挂载到html上,vue 源码学习 - 实例挂载

    前言 在学习vue源码之前需要先了解源码目录设计(了解各个模块的功能)丶Flow语法. src ├── compiler # 把模板解析成 ast 语法树,ast 语法树优化,代码生成等功能. ├── ...

  6. 2021-03-19Tomcat源码学习--WebAppClassLoader类加载机制

    Tomcat源码学习--WebAppClassLoader类加载机制 在WebappClassLoaderBase中重写了ClassLoader的loadClass方法,在这个实现方法中我们可以一窥t ...

  7. jQuery源码学习之Callbacks

    jQuery源码学习之Callbacks jQuery的ajax.deferred通过回调实现异步,其实现核心是Callbacks. 使用方法 使用首先要先新建一个实例对象.创建时可以传入参数flag ...

  8. JDK源码学习笔记——Integer

    一.类定义 public final class Integer extends Number implements Comparable<Integer> 二.属性 private fi ...

  9. DotText源码学习——ASP.NET的工作机制

    --本文是<项目驱动学习--DotText源码学习>系列的第一篇文章,在这之后会持续发表相关的文章. 概论 在阅读DotText源码之前,让我们首先了解一下ASP.NET的工作机制,可以使 ...

最新文章

  1. 基于SSM实现二手交易系统
  2. if condition 大于_if __name__ == #x27;__main__#x27;: 究竟起什么作用,阅读本文后,其他文章不必再看...
  3. Soldier and Traveling
  4. oracle 启用闪回数据库,如何启用Oracle10g闪回数据库特性
  5. 崩溃!新浪程序员加班错失 77 万年会大奖
  6. Python+Selenium自动化测试:Page Object模式
  7. poj1200 Crazy Search(hash)
  8. java序列化(六) - protostuff序列化
  9. ubuntu linux 批量删除文件
  10. 长沙理工大学第十二届ACM大赛【9/12】
  11. 腾讯云发布容器安全白皮书
  12. Android 设置空白背景Activity
  13. geohash 模块安装及使用(Anaconda.Python 2)
  14. Java历史、现状和各版本技术更迭总结
  15. Unity 接讯飞离线语音识别
  16. 个体工商户核名查询_网上核名怎么查询
  17. Unity shader 关于卡通渲染阴影闭塞的实现
  18. 1.28 Cubemx_STM32H743 触摸屏
  19. html 加减法,加减法速算技巧太神奇了!
  20. 河南省许昌市谷歌高清卫星地图下载

热门文章

  1. android handler同步,android解决:使用多线程和Handler同步更新UI
  2. java实现日期让随动变_java工具类(四)之实现日期随意跳转
  3. Python小白的数学建模课-23.数据拟合全集
  4. 计算机电路基础答案,计算机电路基础模拟试卷答案(B)
  5. matlab时域分析论文,基于Matlab语言的数字信号时域相关性研究与分析.doc
  6. 什么是python自动化测试_python已经自动化了,大家一般用什么测试框架?
  7. 联想微型计算机启天e4300,戴尔轻薄商务本Latitude E4200/E4300开卖
  8. Fiddler无所不能——之测试开发攻城狮必备神器
  9. 【测试】用例设计思路-六方面
  10. 【文章】人的好运从哪里来?