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 ...
随机推荐
- Java反射机制(五):使用反射增强简单工厂设计模式
关于简单工厂设计模式的讲解,可参考博文<设计模式: 简单工厂模式>,此处不再介绍: 我们先观察之前介绍的关于简单工厂: public class OperateFactory { pub ...
- 2016.1.22 扩充临时表空间解决ora-01652错误
今天运行一个复杂查询时报错ora-01652 无法通过128 扩展temp段, 网上说是临时表空间大小不够,运行了脚本调整临时表空间,问题解决 alter database tempfile '/ap ...
- Python数据可视化matplotlib和seaborn
Python在数据科学中的地位,不仅仅是因为numpy, scipy, pandas, scikit-learn这些高效易用.接口统一的科学计算包,其强大的数据可视化工具也是重要组成部分.在Pytho ...
- Java中方法的格式
[修饰符] 返回值类型 方法名([参数类型 形式参数1,参数类型 形式参数2,……]) { 执行语句; [return 返回值;]//需要的话 } 参数列表(参数的类型 ...
- Vue的Router路由传参
一.文件结构 二.vue.js 打开此链接 https://cdn.bootcss.com/vue/2.6.10/vue.js 复制粘贴页面的所有内容 三.vue-router.js 打开此链接 h ...
- Educational Codeforces Round 65 (Rated for Div. 2) E. Range Deleting(思维+coding)
传送门 参考资料: [1]:https://blog.csdn.net/weixin_43262291/article/details/90271693 题意: 给你一个包含 n 个数的序列 a,并且 ...
- python基础九之函数
1,函数的定义 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段.函数分为自定义函数和内置函数,内置函数就是python内部自带的一些函数,如:print().int()等.自定义函数 ...
- Eclipse修改编码字体
步骤:Window-->Preference-->General-->Appearance-->Colors and Fonts-->java-->java Edi ...
- 【t098】符文之语
Time Limit: 1 second Memory Limit: 128 MB [问题描述] 当小FF来到神庙时,神庙已经破败不堪了.但神庙的中央有一个光亮如新的石台.小FF走进石台, 发现石台上 ...
- CF1209
CF1209 A B 水题不管 C 因为要求最终整个序列是要单调的 所以我们就考虑枚举断点$x$ 之后把$<x$的数放到第一个集合 把$> x$的数放到第二个集合 至于$=x$的数 他能放 ...