原文 NGUI三大基础机制:https://gameinstitute.qq.com/community/detail/109914
本文介绍以NGUI的版本是3.6.0版本为基础
基础介绍
NGUI的UIWidget, UIDrawCall,UIGeometry和 UIPanel等基础脚本。
Ø UIWidget是UI的基础组件(UILabel,UISprite)的基类,含有组件的基本信息(width,Height,color 锚点等)
Ø UIGeometry是UIWidget的几何数据,记录了顶点坐标,贴图的UVs和颜色等信息
Ø UIDrawCall是将多个UIWidget的UIGeometry组合起来一起绘制
Ø UIPanel 用于管理UIWidget、UIDrawCall等,实现界面的渲染裁剪、更新。
Ø UIRoot UI界面的根目录,用于分辨率适配和事件广播。
MeshFilter 和Mesh介绍:
MeshFilter网格过滤器用于从你的资源中获取网格信息(Mesh)并将其传递到用于将其渲染到屏幕的网格渲染器当中。MeshFilter 与 Mesh 联合使用,使模型显示到屏幕上。要想在场景中看到这个网格(mesh),还需要为游戏对象(GameObject)添加一个网格渲染器(MeshRenderer),它应该是自动被添加的。但是如果你将它从你的对象中移除。你必须手动重新添加它。如果网格渲染器(MeshRenderer)不存在,这个网格仍将存在于你的场景中。但是它将不会被绘制。
NGUI的渲染机制
要详细的了解NGUI渲染机制,首先需要打开NGUI隐藏的渲染节点,秘密就在在UIDrawCall.Create(string name) 中的HideFlags.HideAndDontSave, typeof(UIDrawCall));这一行代码。打开在UIDrawCall.cs文件,打开SHOW_HIDDEN_OBJECTS宏定义。就可以看到在渲染过程中,每一个UIDrawCall对应一个把UIDrawCall作为组建的节点【在编辑器可见】如图所示:
从上面的图就可以看出来,NGUI渲染实际上就是对通过对Mesh的渲染实现的。整个NGUI的渲染过程就把图片和文字按照一定顺序和规则组织成一系列的Mesh,然后通过Unity自身的渲染流程实现渲染。
NGUI的渲染流程
渲染过程开始的地方UIPanel.LateUpdate:在这个函数有函数调用Updateself 。
Updateself中:UpdateWidgets:更新UIWeight的位置信息、可见性[含Alpha]、UV信息,是否渲染刷新。UIsprite就是继承于UIWeight的OnFill函数实现多样的化的填装方式(即把UIWeight所需要的数据处理到UIGeometry节点中),如:拉伸、九宫格等等。
FillAllDrawCalls:全体DrawCall节点刷新。
FillDrawCall:单个DrawCall节点刷新。
首先介绍FillDrawCall:顾名思义,这个函数是刷新单个的Drawcall节点
找到属于这个DrawCall的UIWeight,然后对找到的每个UIWeight处理UV数据的组装,而这个UIWeight的数据就保存在自身的UIGeometry节点上。然后把这个Draw的数据刷新到Mesh上面去即采用UIDrawCall.UpdateGemetry。
其次是FillAllDrawCalls:顾名思义,这个函数是刷新所有的的Drawcall节点,及重建Drawcall即节点。第一步:删除已经存在的Drawcall节点。第二步:对所有的UIWeight经行排序主要按照深度值和材质。第三步:逐个顺序处理UIWeight,把相邻且具有相同的材质的UIWeight的UIGeometry数据添加到同一个UIDrawCall上来,然后把数据刷新到Mesh上。