概述
UGUI整体分成UnityEngine.EventSystems和UnityEngine.UI。
渲染系统
- UI组件在渲染时,需要三部分数据:顶点,材质,Layout布局。
- UI组件在OnEnable或自身数据更改时,会把自己放入CanvasUpdateRegistry的一个缓存的列表中,当UI组件所属的Canvas更新时,会遍历这个缓存中的列表,然后调用UI组件的各个方法来更新UI组件自身的数据(顶点、UV等)。
UI组件的渲染
- UI组件在渲染时,需要三部分数据:顶点,材质,Layout布局。
- UI组件在OnEnable或自身数据更改时,会把自己放入CanvasUpdateRegistry的一个缓存的列表中,当UI组件所属的Canvas更新时,会遍历这个缓存中的列表,然后调用UI组件的各个方法来更新UI组件自身的数据(顶点、UV等)。
CanvasUpdateRegistry
- 在这个类中,执行画布刷新注册事件。
- 在Canvas更新时会调用将要刷新界面的委托–willRenderCanvases。
- willRenderCanvases委托注册了一个PerformUpdate方法,遍历缓存列表,进行Rebuild更新。
Graphic
渲染部分
在OnEnable中,执行了SerAllDirty()方法,更新自身的顶点,材质,Layout布局。
Vertices更新:在**DoMeshGeneration()和DoLegacyMeshGeneration()**方法中,根据自己的情况生成Mesh。
DoMeshGeneration调用了OnPopulateMesh,将VertexHelper数据实装到Mesh,然后赋值给CanvasRenderer进行渲染。流程
CanvasUpdateRegistry -> Graphic -> Rebuild -> DoMeshGeneration -> OnPopulateMesh
Image
- 继承关系
MaskableGraphic,ISerializationCallbackReceiver,ILayoutElement,ICanvasRaycastFilter
- MaskableGraphic
MaskableGraphic主要是对Graphic基类中的几个成员对象进行重写。
- mainTexture属性:主要负责提供贴图
- material属性:主要提供材质
- OnPopulateMesh函数:主要提供顶点以及UV信息(也就是Mesh信息)
- OnPopulateMesh函数
主要针对VertexHelper这么一个存放渲染Mesh信息的容器,对其填充,修改顶点等数据。
扩展:使用UGUI的时候其实每一个Image都是使用了PopulateMesh来进行Mesh生成之后进行合批,我们其实可以将这一步直接放在这一个函数里面,由我们自己来重写就可以了,这样我们就不需要调用N次PopulateMesh之后进行合并,而只需要调用一次自己编写的PopulateMesh函数就可以了。
此函数的调用时机:DoMeshGeneration调用了OnPopulateMesh。
事件系统
EventSystem
处理和管理点击、触摸、键盘输入等事件。
持有输入模块、每帧更新输入模块、执行输入模块的Process(每帧处理)方法。
每个场景只需要一个EventSystem。
方法解析
- UpdateModule():在输入模块Enable、本身的Update中调用。该方法获取输入模块,并放入m_SystemInputModules缓存中。
- TickModules():在Update中调用。遍历m_SystemInputModules缓存中输入模块并更新它们的状态,同时找到第一个启用并且在当前平台可用的输入模块,将该模块赋值给m_CurrentInputModule字段。
- Update():每帧执行,调用TickModules()、m_CurrentInputModule的Process();
- RaycastAll():被输入模块调用。遍历所有的GraphicRaycaster对象并执行其Raycast方法,然后得到raycastResults列表(该列表中第一个就是被点击的对象)。
总结
EventSystem的主要功能就是持有输入模块,更新输入模块,驱动整个事件系统的运行。
StandaloneInputModule
生成和处理各种EventData,判断输入状态,调用ExecuteEvents执行注册的各种输入事件。
方法解析
- Process():由EventSystem每帧调用,驱动整个输入系统。生成输入数据,调用射线检测,调用排序,判断操作模式(点击,拖拽等),调用操作模式对应的注册方法等。
- SendUpdateEventToSelectedObject():对currentSlectedGameObject执行其OnUpdateSelected方法,更新选中的物体。
- ProcessTouchEvents():处理触摸事件
GraphicRaycaster
获取哪些UI物体会被点击到。
EventInterface
各种操作事件的接口。
Button
- 继承关系
1 | public class Button : Selectable, IPointerClickHandler, ISubmitHandler |
动画部分
这部分相对比较简单,用了tween补间动画的形式,对颜色,位置,大小做了渐进的操作。
tween的原理是在启动一个协程,在协程里对元素的属性渐进式的修改,除了修改属性数值,tween还有多种曲线可以选择,比如内番曲线,外翻曲线等,一个数值从起点到终点的过程可以由曲线来控制。