UGUI基础原理
-
Graphic[图形]
[RequireComponent(typeof(CanvasRenderer))]
[RequireComponent(typeof(RectTransform))]
[Graphic][2]类是由Unity UI系统的C#库提供的基类,所有的向画布系统提供可绘制几何内容的UI系统C#类都继承它。
大多数内置的UI系统绘图类都是通过 MaskableGraphic 子类实现的,这个子类实现了 IMaskable 接口,可以被遮罩。
Drawable类的主要子类是 Image 和 Text ,它们能提供与其名称相对应的内容。- Graphic是UGUI的图形功能基类,它必须依赖CanvasRenderer与RectTransform 组件运行。
- 内置UI系统通过MaskableGraphic实现,使用了IMaskabel接口,可被遮罩。
- Text何Image都继承自MaskableGraphic, ILayoutElement(及其他)
-
Layout[布局]
[RequireComponent(typeof(RectTransform))]
Layout组件(如
ScrollRect
)控制RectTransform的尺寸和位置,它通常用于创建具有复杂布局并且内部组件需要相对尺寸或者相对位置的UI。
Layout组件只依赖RectTransform并且只影响与其关联的RectTransform的属性。他们不依赖Graphic类,并且可以独立于UI系统的Graphic类使用。- 用于控制内部组件相对尺寸和相对位置,只依赖RectTransform,可独立与Graphic类使用,例如排布子类中空的GameObject的位置
说明:
Graphic标记脏画布时重建时会调用[CanvasUpdateRegistry][1] 类中的
RegisterCanvasElementForGraphicRebuild
Layout组件则调用[CanvasUpdateRegistry][1]中的RegisterCanvasElementForLayoutRebuild
。
这个类跟踪那些需要进行更新的Layout组件和Graphic组件集合,并在与其相关的画布调用 willRenderCanvases 事件时根据需要触发PerformUpdate
进行更新。
Layout和Graphic组件的更新称为 重建(rebuild)- rebuild的底层与[CanvasUpdateRegistry][1]有关,因此图形UI和RectTransform的变化都会(且主要是因此)引起rebuild。
willRenderCanvases
方法是查看UI性能的重要指标。
-
Canvas[画布]
画布(Canvas) 是以原生代码编写的Unity组件,画布负责将其内部的几何形状合并到批处理、生成合适的渲染指令并发送到Unity图形系统。这些操作都由原生C++代码完成,这被称为 重新批处理(rebatch) 或 批处理构建(batch build) 。当一个画布被标记为含有需要重新批处理的几何形状时,称这个画布为 脏画布。
这个canvas其实在UGUI里面重要的作用就是生成UI组件,然后生成command命令,然后传递到GPU,最后由GPU把它们画出来,完成的是这么一个过程。在生成UI组件的过程当中,也包括了布局,就是哪些UI显示在哪个位置&#