UGUI源码之EventSystem
今天研究下UGUI的源码,先从EventSystem入手。EventSystem是用来处理点击、键盘输入以及触摸等事件的。
1.BaseInputModule
EventSystem开头声明了两个变量,系统的输入模块列表和当前输入模块
private List<BaseInputModule> m_SystemInputModules = new List<BaseInputModule>();
private BaseInputModule m_CurrentInputModule;
BaseInputModule是一个抽象类,PointerInputModule继承于BaseInputModule,也是一个抽象类,StandaloneInputModule和TouchInputModule又继承于PointerInputModule。
StandaloneInputModule:基本的键盘和鼠标输入系统,并跟踪鼠标的位置,以及鼠标/键盘所按下的按键,是面向pc平台的输入模块。
TouchInputModule:基本的触摸输入系统,用于处理触摸、拖拽以及位置数据,是面向移动平台的输入模块。
EventSystem的Update函数中会执行TickModules函数,用于更新m_SystemInputModules的每一个输入模块。
然后遍历m_SystemInputModules,判断是否支持当前平台且处于激活状态,若有赋值给m_CurrentInputModule,若无便选择m_SystemInputModules的第一个支持当前平台的输入模块赋值给m_CurrentInputModule。
再判断是否满足条件if (!changedModule && m_CurrentInputModule != null),当前输入模块执行Process函数,m_CurrentInputModule.Process();
StandaloneInputModule的Process函数中,会把各类事件传递给EventSystem的m_CurrentSelected。m_CurrentSelected由SetSelectedGameObject方法进行设置,并且会对上一个被选中的对象执行取消事件,对新设置的对象执行选中事件。
ExecuteEvents.Execute(m_CurrentSelected, pointer, ExecuteEvents.deselectHandler);
m_CurrentSelected = selected;
ExecuteEvents.Execute(m_CurrentSelected, pointer, ExecuteEvents.selectHandler);
TouchInputModule的Process函数中,会根据是否支持触摸,分别执行FakeTouches(用鼠标模拟触摸)和ProcessTouchEvents函数。ProcessTouchEvents会调用GetTouchPointerEventData函数,GetTouchPointerEventData会通过eventSystem.RaycastAll函数找到第一个被射线照射到的对象,存到一个PointerEventData变量中。然后根据这个PointerEventData变量执行相应的触摸、拖拽等事件。
private void ProcessTouchEvents()
{
for (int i = ; i < input.touchCount; ++i)
{
Touch touch = input.GetTouch(i); if (touch.type == TouchType.Indirect)
continue; bool released;
bool pressed;
var pointer = GetTouchPointerEventData(touch, out pressed, out released); ProcessTouchPress(pointer, pressed, released); if (!released)
{
ProcessMove(pointer);
ProcessDrag(pointer);
}
else
RemovePointerData(pointer);
}
}
2.事件接口
上文提到过ExecuteEvents.Execute函数执行事件,ExecuteEvents是一个静态类,里面声明了一个泛型委托EventFunction,对EventInterfaces的大部分接口声明EventFunction类型的委托变量和函数。例如:
private static readonly EventFunction<ISelectHandler> s_SelectHandler = Execute;
private static void Execute(ISelectHandler handler, BaseEventData eventData)
{
handler.OnSelect(eventData);
}
在EventSystem里调用:
ExecuteEvents.Execute(m_CurrentSelected, pointer, ExecuteEvents.selectHandler);
在ExecuteEvents的Execute函数中
public static bool Execute<T>(GameObject target, BaseEventData eventData, EventFunction<T> functor) where T : IEventSystemHandler
会执行functor(arg, eventData),也就是执行arg.OnSelect(eventData)。
EventInterfaces的接口如下:
IPointerEnterHandler//指针进入
IPointerExitHandler//指针离开
IPointerDownHandler//指针按下
IPointerUpHandler//指针抬起
IPointerClickHandler//指针点击
IBeginDragHandler//开始拖拽
IInitializePotentialDragHandler//当发现拖动但在开始拖动有效之前由BaseInputModule调用
IDragHandler//拖拽中
IEndDragHandler//结束拖拽
IDropHandler//结束拖拽时所在gameobject调用
IScrollHandler//鼠标滚轮
IUpdateSelectedHandler//选中物体时,持续触发
ISelectHandler//选中物体
IDeselectHandler//取消选中物体
IMoveHandler//物体移动
ISubmitHandler//提交按钮被按下
ICancelHandler//取消按钮被按下
UGUI源码之EventSystem的更多相关文章
- 【UGUI源码分析】Unity遮罩之Mask详细解读
遮罩,顾名思义是一种可以掩盖其它元素的控件.常用于修改其它元素的外观,或限制元素的形状.比如ScrollView或者圆头像效果都有用到遮罩功能.本系列文章希望通过阅读UGUI源码的方式,来探究遮罩的实 ...
- 【UGUI源码分析】Unity遮罩之RectMask2D详细解读
遮罩,顾名思义是一种可以掩盖其它元素的控件.常用于修改其它元素的外观,或限制元素的形状.比如ScrollView或者圆头像效果都有用到遮罩功能.本系列文章希望通过阅读UGUI源码的方式,来探究遮罩的实 ...
- UGUI源码之Selectable
Selectable是Button.InputField.Toggle.ScrollBar.Slider.Dropdown的基类. Selectable的继承的类与接口如下: public class ...
- uGUI源码调试
uGUI源代码地址:https://bitbucket.org/Unity-Technologies/ui 工具编译后转换位置{Unity3D_Vserion}\Editor\Data\UnityEx ...
- UGUI源码之Graphic
Graphic是用来显示图像的一个抽象类,是MaskableGraphic的父类,而MaskableGraphic是Image.RawImage.Text的父类. Graphic继承于UIBehavi ...
- Unity UGUI图文混排源码(一)
Unity UGUI图文混排源码(一):http://blog.csdn.net/qq992817263/article/details/51112304 Unity UGUI图文混排源码(二):ht ...
- [UGUI]图文混排(二):Text源码分析
UGUI源码: https://bitbucket.org/Unity-Technologies/ui/downloads/?tab=tags 首先下载一份UGUI源码,这里我下载的版本是5.3.2f ...
- Unity UGUI图文混排源码(三) -- 动态表情
这里是根据图文混排源码(二)进一步修改的,其他链接也不贴了,就贴一个链接就好了,第一次看这文章的同学可以先去看看其他几篇文章 Unity UGUI图文混排源码(二):http://blog.csdn. ...
- Unity UGUI图文混排源码(二)
Unity UGUI图文混排源码(一):http://blog.csdn.net/qq992817263/article/details/51112304 Unity UGUI图文混排源码(二):ht ...
随机推荐
- 2018-8-10-win10-uwp-使用-Geometry-resources-在-xaml
title author date CreateTime categories win10 uwp 使用 Geometry resources 在 xaml lindexi 2018-08-10 19 ...
- 人脸检测MTCNN的训练过程(PRO网络)
以下学习均由此:https://github.com/AITTSMD/MTCNN-Tensorflow 数据集 WIDER Face for face detection and Celeba for ...
- P1058 车厢重组
题目描述 在一个旧式的火车站旁边有一座桥,其桥面可以绕河中心的桥墩水平旋转.一个车站的职工发现桥的长度最多能容纳两节车厢,如果将桥旋转 \(180\) 度,则可以把相邻两节车厢的位置交换,用这种方法可 ...
- Jmeter 发送json
阅读更多 使用jmeter发送json数据.方法有三种 原创,转载请注明出处 1.利用CSV Data set Config. 参考: http://demi-panda.com/2013/01/08 ...
- Python涉及的各个领域以及技术应用
WEB开发 完全主义者高效率框架Django 异步高并发Tornado框架 短小精悍Flask,Bottle框架 网络编程 高并发Twisted网络框架 Python3引入的asyncio异步编程 爬 ...
- Linux 内核PC/104 和 PC/104+
当前在工业世界中, 2 个总线体系是非常时髦的: PC/104 和 PC/104+. 2 个在 PC-类 的 单板计算机中都是标准的. 2 个标准都是印刷电路板的特殊形式, 包括板互连的电子的/机械的 ...
- js实现防抖,节流
防抖函数. 将几次操作合并为一次操作进行.设置一个计时器,规定在延迟时间后触发函数,但是在延迟时间内如果再次触发,就会取消之前的计时器.如此,只有最后一次操作能触发.代码如下: function de ...
- nodejs的nvm与.net的dnvm使用对比
一.vm安装命令 nodejs的nvm安装命令: curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.29.0/install.s ...
- git之分支
分支相互之间互不干扰 1.小乌龟创建分支,切换/检出 创建后直接切换到该分支,另一个需要再切换一下. 2.点击这个可以看到所有的分支,进行删除操作. 3.在fen1,fen2分别进行操作更新,互不 ...
- SQLAlchemy的增删改查 一对多 多对多
Models只是配置和使用比较简单,因为是Django自带的ORM框架,所以兼容性不行,所以出现了SQLAlchemy,SQLAlchemy是比较全面的ORM框架,它可以在任何使用SQL查询时使用 以 ...