博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[源码学习]--UGUI
阅读量:2028 次
发布时间:2019-04-28

本文共 2681 字,大约阅读时间需要 8 分钟。

学习参考

事件系统

UnityEngine.UI/EventSystem/EventSystem.cs

private List
m_SystemInputModules = new List
(); // 系统输入模块列表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
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 轮廓

转载地址:http://yqjaf.baihongyu.com/

你可能感兴趣的文章
每天进步一点点——Linux中的线程局部存储(二)
查看>>
【C++】explicit关键字
查看>>
八大排序算法
查看>>
C++ 11
查看>>
Spring @Configuration 和 @Component 区别
查看>>
JVM内存模型
查看>>
syslog日志记录
查看>>
Linux下的动态库.so
查看>>
jQuery解决input中placeholder值在ie中无法支持的问题
查看>>
一文深度揭秘Redis的磁盘持久化机制
查看>>
java是编译型还是解释型语言
查看>>
Spring的BeanUtils的copyProperties方法需要注意的点
查看>>
NotePad 常用快捷键总结
查看>>
Notepad++如何让打开的文件排在左边菜单栏
查看>>
File类的常用方法【二】
查看>>
为什么说栈的速度快,堆的速度慢?栈和堆的区别是什么?
查看>>
微信支付兴起,万亿级用户交易记录存储的挑战
查看>>
Java nio 实现socket异步通信
查看>>
商品秒杀系统设计思路
查看>>
Java自带的JVM性能监控及调优工具(jps、jinfo、jstat、jmap、javap)使用介绍
查看>>