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渲染
流程:
监听到VertsDirty的标记
MONO生命周期事件,Canvas变动等,都会触发Verts Dirty。
使用一个Static的Mesh容器(Unity Shared UI Mesh)
workerMesh, Profiler中名称为”Unity Shared UI Mesh”。
根据Graphic的上的RectTransform计算Mesh
- Graphic有一个VertexHelper, 专门用于辅助计算Mesh信息。
- 如果RectTransform宽高任意为0,那么Mesh中无顶点。
- 根据RectTransform和所在Canvas, 计算出这个对象Pixel perfect的Rect。
- 将此Rect记录的数据和Graphic.Color填充进Mesh。
根据Graphic上其他的IMeshModifier修改Mesh
获取Graphic.gameObject上所有的IMeshModifier,顺序修改workerMesh。
此流程为一些特殊效果提供了修改Graphic顶点的流程。
将计算好的workerMesh传递到CanvasRenderer (黑盒了,开源到此为止)
主要功能:修改Material属性
从Canvas获取当前要使用的Material对象
当MaterialDirty脏标被开启时
给Graphic.gameObject上挂载的IMaterialModifier提供修改材质的步骤。
- 被修改好的Material与mainTexture一起被更新到CanvasRenderer。
主要功能:Raycast 接受UI射线
这块主要是接受GraphicRaycast组件的Raycast调用,会根据对象身上绑定的ICanvasRaycastFiller来计算射线结果。
