今天研究下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//取消按钮被按下

最新文章

  1. FASTJSON
  2. HBase参数配置及说明(转)
  3. setAttribute改变属性,动态改变类
  4. Android开发之网络请求HttpURLConnection
  5. [Javascript] An Introduction to JSPM (JavaScript Package Manager)
  6. C# 使用摄像头拍照 支持Win7 64位
  7. 蓝桥网试题 java 基础练习 查找整数
  8. 第1阶段——u-boot分析之make 100ask24x0_config指令(1)
  9. 最重要的 Java EE 最佳实践
  10. 翻译:CREATE DATABASE语句
  11. 软件测试人员在工作中如何运用Linux
  12. ztree树应用
  13. 学习现代 JavaScript 编程的最佳教程
  14. javascript 列表定时滚动效果
  15. update使用inner join
  16. 【2019北京集训2】Elephant 平衡树
  17. 11个教程中不常被提及的JavaScript小技巧
  18. Java模板引擎之freemarker简介
  19. CocoaPods的使用(一) 安装
  20. P3397 地毯

热门文章

  1. CentOS7 network.service loaded failed 处理技巧
  2. 深入java面向对象四:Java 内部类种类及使用解析(转)
  3. 2018-2-13-win10-uwp-InkCanvas控件数据绑定
  4. jQuery-自己封装的弹框
  5. P1025 最大完美度
  6. linux 快速和慢速处理
  7. C# 如何引用 WshShell 类
  8. dynamic web module version
  9. C# Abort() 多线程运行逻辑
  10. ES基本语法