UGUI源码深度解析(一)事件系统

介绍事件系统各个类的主要功能

UGUI源码深度解析(一)事件系统_第1张图片

 

  1. EventInterFace 定义所有事件的接口 点击 拖拽
  2. EventSystems 事件的主程序 有Update,Update中 是各个输入Module的 调用检测,每个Module中也是通过EventSystems的Update没帧进行点击(输入)检测、 射线检测调用EventSystems RaycastAll, 遍历各个模块的module(Canvas),( Canvas继承自GraphicRaycst)。调用module的racast方法GraphicRaycst对象中的 racast方法,这里也创建了一个射线ray是用于检测ui与2dui(2dsprite)3d物体(cube等)的检测筛选 ,然后得到遮挡的距离 (后期用于比较与 ui碰撞的距离),接下来调用Raycast方法 检测canvas下所有的子graphic物体,通过RectTransformUtility.RectangleContainsScreenPoint()方法判断点击的点是否在 物体的矩形框RectTransform内,然后调用每个 graphic物体自己的Raycast 方法 里面可能做一些自己的检测() 例如 点击不透明物体 alpha为0的地方不做检测)
  3. EventTrigger 实现了所有事件的接口 可在gameobject中挂这个脚本选择一下想实现的接口的事件
  4. EventTriggerType 事件类型
  5. ExecuteEvents处理事件,
  6. MoveDirection 移动方向是由BaseInput中的DetermineMoveDirection 方法进行复制
  7. RayCastResult 射线检测结果 在输入模块中定义list 传入到 raycas模块中复制回到 输入模块中 选出FindFirstRaycast
  8. RayCasterManager 存储一个List 继承BaseRaycaster的例如Canvas onEnable的时候加入列表 disable的时候 remove
  9. UIBehaviour 抽象基类 定义生命周期函数和一些更新改变函数
  10. AxisEventData 轴事件数据 在baseInput中GetAxisEventData 复制返回调用 在standaloneInputModule中根据键盘上下左右返回移动方向moveDir和 moveVector
  11. BaseEventData 三个最基本的 当前eventSystem currentInputModule selectedObject
  12. PointEventData 事件系统传递的数据
  13. BaseInputModule 输入模块的基础类 ,里面定义了List 射线检测结果,定义了输入数据AxisEventData,BaseEventData。还有一个BaseInput,BaseInput里是Input类的一些输入操作 鼠标啊Touch啊的,FindFirstRaycast方法 找到第一次被检测出来的物体,还有得到MoveDirection的方法(移动方向),处理Exit和Enter的事件以及抽象方法Process 继承BaseInputModule的都实现这个Process 在eventsystem中的Update被调用
  14. PointInputModele 被下面两个类继承,里面肯定有一些是通用的,管理Dictionary m_PointerData,m_PointerData输入数据的add remove clear 还有Get,MouseState m_MouseStatev m_MouseState的创建、get,MouseState 里面定义了List ,包含对ButtonState创建、get,ButtonState实际上就会创建三个 左右中 鼠标按下的按钮,没有remove和销毁MouseState ButtonState是一起的 与 m_PointerData是分开的 MouseState ButtonState是输入的鼠标点击状态 固定的
  15. PointerData是输入数据信息包含了点击位置点击物体
  16. PointInputModele里调用了eventSystem的recastall处理了Move和Drag事件
  17. StabdaloneInputModule 重写了Process() 在ProcessMouseEvent这个函数中 先得到mouseData处理鼠标按下 移动 拖拽 事件ProcessMousePress(leftButtonData);ProcessMove(leftButtonData.buttonData);ProcessDrag(leftButtonData.buttonData);ProcessMousePress按下事件使用了GetmouthButtonDown和GetMouthButtonUp分按下和释放用if做的判断 然后先处理了Ondown,然后在处理0.3s内按下多次的话 记为双击啊三击啊 If(Released) 释放鼠标的时候 判断释放跟点击是否在同一个元素上如果是 就是处理点击。如果正在拖拽 pointerEvent.dragging处理endDragHandler事件
  18. TouchInputModule//触摸输入模块不再需要,因为触摸输入现在在标准输入模块中处理。[Obsolete("TouchInputModule is no longer required as Touch input is now handled in StandaloneInputModule.")]
  19. BaseInputModule一个抽象类,PointerInputModule继承自它,同样也是抽象类,而StandaloneInputModule和TouchInputModule又继承自PointerInputModule。StandaloneInputModule是面向“PC, Mac& Linux Standalone”这个平台的输入模块,而TouchInputModule是面向“iOS”、“Android”等可触摸移动平台的输入模块。
  20. BaseRaycaster 基类主要是onenale的时候把自己AddRaycaster 在OnDisable的时候RemoveRaycasters
  21. Physics2DRaycaster只是把RaycastHit[] 换成了RaycastHit2D[]
  22. PhsicsRaycaster UI里应该是没有用上 ,这个就是用来判断3d物理的射线(再看一看能不能用)实际上是eventCamera.ScreenPointToRay 点击屏幕 由屏幕某点像屏幕里发出射线,射线检测范围是远裁剪到近裁剪屏幕的距离
  23. PhsicsRaycaster 和Physics2DRaycaster 可以实现3d物体的点击 同样的点击之后得出rayresult 然后处理 ieventsystem
  24. GraphicRaycaster 射线 Canvas下挂载这脚本Raycast方法中 先找到Canvas下所有Graphic然后判断Ray ray 射线是否被2d 3d物体阻隔然后调用Raycast,里面for循环 Graphic 利用RectTransformUtility.RectangleContainsScreenPoint(graphic.rectTransform, pointerPosition, eventCamera))判断在canvas下 元素如image 矩形内部  如果点在矩形内,则为true在调用每个 graphic 自己的graphic.Raycast在graphic.Raycast里面 ICanvasRaycastFilter 

你可能感兴趣的:(UGUI,UGUI源码解析,UGUI,源码,事件系统)