UIWidget是UI的基础组件(UILable、UISprite)的基类,含有组件的基本信息(width、height、color等)。
UIGeometry是UIWidget的几何数据,记录了顶点坐标、贴图的UVs和颜色信息。
UIDrawCall是将多个UIWidget的UIGeometry组合起来一起绘制,具体的UIWidget如果公用一个UIDrawCall由UIPanel控制。
UIRect是Widget和Panel的基类,它是一个抽象类。它为UIPanel和UIWidget提供了一些公用的方法,这些方法通过AnchorPoint设置后两者的矩形区域。UIRect是为UI组件描述其位置和尺寸信息,通过AnchorPoint来实现,根据目标参考系和相对位置来计算矩形区域的每一个边的位置。
简要的NGUI的图形工作流程
UIGeometry被UIWidget实例化后,通过UIWidget的子类,也就是UISprite、UILabel等,在OnFill()函数里算出所需的Geometry缓存(顶点数、UV、Color、法线、切线)。
在UIPanle,通过遍历自己子类下所有的UIWidget组件(按深度排序),先创建一个UIDrawCall,如此反复循环搜索该UIPanel下的每一个Widget,只要是material,texture,shader都和上一个widget一样的widget,它们的缓存都传给同一个UIDrawCall,直到循环结束或者碰到一个material,texture,shader对象任一不同的Widget。当遇到这种Widget,循环会创建一个新的UIDrawCall,然后传递material,texture,shader,缓存,如此继续,知道循环结束。
每次有新的UIDrawCall产生,UIPanel都会调用上一个UIDrawCall的UpdateGeometry()来创建渲染所需的对象。这些对象包括MeshFilter、MeshRender和Mesh(Mesh的vertices、uv、color、Normals、tangents和triangles)。