2020-12-04

UGUI源码阅读笔记-G...

Graphic

所有可视UI组件的基类

核心逻辑是监听各种生命周期事件,生成修改UIMesh/Material,交由CanvasRender渲染

有几个参与渲染的关键属性:

mainTexture

Graphic要显示的texture对象,会被传递给CanvasRenderer, Matertal和Shader _MainTex

此属性可以被重写,用来控制在UI渲染管线中的贴图(例如Image和RawImage)

为空的话,会被赋值为Texture2d.white

material/materialForRendering

从Canvas获取的defaultMaterial(黑盒)

vertextHelper

一个用于计算Mesh尺寸的辅助类型,Graphic关于mesh数据的构建都在它内部做,最后由它来填充workerMesh

主要功能:生成Mesh交由CanvasRenderer渲染

流程:

  1. 监听到VertsDirty的标记

    MONO生命周期事件,Canvas变动等,都会触发Verts Dirty。

  2. 使用一个Static的Mesh容器(Unity Shared UI Mesh)

    workerMesh, Profiler中名称为”Unity Shared UI Mesh”。

  3. 根据Graphic的上的RectTransform计算Mesh

    • Graphic有一个VertexHelper, 专门用于辅助计算Mesh信息。
    • 如果RectTransform宽高任意为0,那么Mesh中无顶点。
    • 根据RectTransform和所在Canvas, 计算出这个对象Pixel perfect的Rect。
    • 将此Rect记录的数据和Graphic.Color填充进Mesh。
  4. 根据Graphic上其他的IMeshModifier修改Mesh

    获取Graphic.gameObject上所有的IMeshModifier,顺序修改workerMesh。

    此流程为一些特殊效果提供了修改Graphic顶点的流程。

  5. 将计算好的workerMesh传递到CanvasRenderer (黑盒了,开源到此为止)

主要功能:修改Material属性
  1. 从Canvas获取当前要使用的Material对象

  2. 当MaterialDirty脏标被开启时

给Graphic.gameObject上挂载的IMaterialModifier提供修改材质的步骤。

  1. 被修改好的Material与mainTexture一起被更新到CanvasRenderer。
主要功能:Raycast 接受UI射线

这块主要是接受GraphicRaycast组件的Raycast调用,会根据对象身上绑定的ICanvasRaycastFiller来计算射线结果。