源码1:EventSystem

     private List<BaseInputModule> m_SystemInputModules = new List<BaseInputModule>();private BaseInputModule m_CurrentInputModule;private  static List<EventSystem> m_EventSystems = new List<EventSystem>();

EventSystem主要是管理输入组件

protected override void OnEnable()
{base.OnEnable();m_EventSystem = GetComponent<EventSystem>();m_EventSystem.UpdateModules();
}public void UpdateModules()
{GetComponents(m_SystemInputModules);var systemInputModulesCount = m_SystemInputModules.Count;for (int i = systemInputModulesCount - 1; i >= 0; i--){if (m_SystemInputModules[i] && m_SystemInputModules[i].IsActive())continue;m_SystemInputModules.RemoveAt(i);}}

每次OnEnable的时候会获取当前EventSystem组件和当前组件上的输入组件BaseInputModule

通常我们创建EventSystem对象上是有绑定StandaloneInputModule 专门用来处理用户的输入

EventSystem会每帧Update 输入模块,通过调用StandaloneInputModule 的process函数来进行输入模块的更新

    protected virtual void Update(){if (current != this)return;TickModules();bool changedModule = false;var systemInputModulesCount = m_SystemInputModules.Count;for (var i = 0; i < systemInputModulesCount; i++){var module = m_SystemInputModules[i];if (module.IsModuleSupported() && module.ShouldActivateModule()){if (m_CurrentInputModule != module){ChangeEventModule(module);changedModule = true;}break;}}// no event module set... set the first valid one...if (m_CurrentInputModule == null){for (var i = 0; i < systemInputModulesCount; i++){var module = m_SystemInputModules[i];if (module.IsModuleSupported()){ChangeEventModule(module);changedModule = true;break;}}}//这里是进行输入模块的执行操作if (!changedModule && m_CurrentInputModule != null)m_CurrentInputModule.Process();#if UNITY_EDITORif (Application.isPlaying){int eventSystemCount = 0;for (int i = 0; i < m_EventSystems.Count; i++){if (m_EventSystems[i].GetType() == typeof(EventSystem))eventSystemCount++;}if (eventSystemCount > 1)Debug.LogWarning("There are " + eventSystemCount + " event systems in the scene. Please ensure there is always exactly one event system in the scene");}
#endif}

射线获取所有点击对象 (这个后续讲解)

        /// <summary>/// Raycast into the scene using all configured BaseRaycasters./// </summary>/// <param name="eventData">Current pointer data.</param>/// <param name="raycastResults">List of 'hits' to populate.</param>public void RaycastAll(PointerEventData eventData, List<RaycastResult> raycastResults){raycastResults.Clear();var modules = RaycasterManager.GetRaycasters();var modulesCount = modules.Count;for (int i = 0; i < modulesCount; ++i){var module = modules[i];if (module == null || !module.IsActive())continue;module.Raycast(eventData, raycastResults);}raycastResults.Sort(s_RaycastComparer);}

看下来其实EventSystem并没有做多少的事情,更多的时将具体的逻辑交给具体的模块去处理。所以说在事件系统中,它更多的是作为一个Manager的存在。

  1. 负责维护输入模块的列表,并将用户输入交给专门的输入模块去处理。
  2. 记录当前选中物体。
  3. 处理射线投射时,将具体逻辑交给RaycasterManager。

UIGU源码分析1:EventSystem相关推荐

  1. UIGU源码分析6:Toggle 和 ToggleGroup

    源码6:Toggle 和 ToggleGroup Toggle public class Toggle : Selectable, IPointerClickHandler, ISubmitHandl ...

  2. UIGU源码分析7:Scrollbar

    源码7:Scrollbar public class Scrollbar : Selectable, IBeginDragHandler, IDragHandler, IInitializePoten ...

  3. UGUI源码分析:开关组件Toggle与ToggleGroup

    系列 UGUI源码分析系列总览 相关前置: UGUI EventSystem源码分析 UGUI源码分析:Selectable交互组件的基类 文章目录 系列 Toggle Toggle组件属性介绍 初始 ...

  4. 【Golang源码分析】Go Web常用程序包gorilla/mux的使用与源码简析

    目录[阅读时间:约10分钟] 一.概述 二.对比: gorilla/mux与net/http DefaultServeMux 三.简单使用 四.源码简析 1.NewRouter函数 2.HandleF ...

  5. SpringBoot-web开发(四): SpringMVC的拓展、接管(源码分析)

    [SpringBoot-web系列]前文: SpringBoot-web开发(一): 静态资源的导入(源码分析) SpringBoot-web开发(二): 页面和图标定制(源码分析) SpringBo ...

  6. SpringBoot-web开发(二): 页面和图标定制(源码分析)

    [SpringBoot-web系列]前文: SpringBoot-web开发(一): 静态资源的导入(源码分析) 目录 一.首页 1. 源码分析 2. 访问首页测试 二.动态页面 1. 动态资源目录t ...

  7. SpringBoot-web开发(一): 静态资源的导入(源码分析)

    目录 方式一:通过WebJars 1. 什么是webjars? 2. webjars的使用 3. webjars结构 4. 解析源码 5. 测试访问 方式二:放入静态资源目录 1. 源码分析 2. 测 ...

  8. Yolov3Yolov4网络结构与源码分析

    Yolov3&Yolov4网络结构与源码分析 从2018年Yolov3年提出的两年后,在原作者声名放弃更新Yolo算法后,俄罗斯的Alexey大神扛起了Yolov4的大旗. 文章目录 论文汇总 ...

  9. ViewGroup的Touch事件分发(源码分析)

    Android中Touch事件的分发又分为View和ViewGroup的事件分发,View的touch事件分发相对比较简单,可参考 View的Touch事件分发(一.初步了解) View的Touch事 ...

最新文章

  1. 机器学习(13)岭回归(线性回归的改进)
  2. php使用ssh远程调用另一个服务器执行命令(python脚本)
  3. python 转 exe -- py2exe库实录
  4. 003_SQL语言简介
  5. 互联网1分钟 |0103
  6. Qt程序怎么在别人的电脑上运行
  7. Java集合篇:ConcurrentHashMap详解(JDK1.6)
  8. 引用一个网络图片作为样式的致命悲剧
  9. Android的一些布局小知识点
  10. python获取字典的值_python取出字典中的所有值的两种方法
  11. 'chcp' 不是内部或外部命令,也不是可运行的程序
  12. 用计算机视频,如何用计算机做视频
  13. 洛谷P1313 计算系数【快速幂+dp】
  14. 宝石光是什么石头_捡到这些石头,都是值钱货
  15. 安卓recovery流程分析【第一篇】
  16. 关于IE6,7下面的一些兼容性问题
  17. Windows 上如何制作简谱
  18. Typora 下载方法(windows/ linux)
  19. 古代帝王有哪些“恩爱夫妻”?
  20. 年味变淡是从我们变得随便开始的

热门文章

  1. 固定docker容器IP方法
  2. Android网络开发(一、Socket通信HTTP通信)
  3. 常用汇编数据传输指令
  4. 文件服务器 小文件,小型文件服务器
  5. 计算机毕业设计springboot化妆品商城网站
  6. 如何把Excel的数据导入python?
  7. 【第80题】JAVA高级技术-多线程14(闭锁和栅栏)
  8. 软件工程导论第3章习题答案
  9. -bash: cannot create temp file for here-document: Permission denied 的解决办法
  10. 什么是静态网站和动态网站?