UIWidget是所有UI组件的基类,持有UI组件的大小,锚点,顶点,颜色,Alpha等所有跟渲染相关的属性。
关键属性:
protected Pivot mPivot //锚点
protected Color mColor; //颜色
protected int mWidth;//组件宽度
protected int mDepth = 0;//显示深度,这个深度是相对于父节Panel的
public UIGeometry geometry;//Geometry对象用来保存顶点,位置,顶点UV,顶点颜色等信息
public UIDrawCall drawCall;//当前UIWidget所使用的绘制对象
protected bool mChanged = true;//记录所有几何和渲染属性是否发生变化 如果发生变化就要在UpdateGeometry里面重新计算顶点信息
public bool fillGeometry = true;//是否允许填充顶点信息
public override Vector3[] localCorners //get方法 获得UIWidget的4个顶点的局部坐标,顺序是:左下,左上,右上,右下
public override Vector3[] worldCorners//get方法 获得UIWidget的4个顶点的世界坐标系坐标,这个方法实际上就是将局部坐标转化为世界坐标
关键方法:
一.UpdateGeometry() 核心方法,更新UI组件的顶点信息。但是这里不并执行渲染,这个方法只是更新了UIWidget渲染所需要的数据,然后Panel会把这些数据传给DrawCall,让DrawCall执行渲染。简单说就是UIWidget负责计算数据,DrawCall把计算好的数据拿来渲染。
部分代码:
//获得通过计算的最终Alpha值,如果不为0要跟上层节点进行混合计算
float finalAlpha = CalculateFinalAlpha(frame);
//是否发生了变化
if (mChanged)
{
mChanged = false;
//如果Ahpha值大于最小值
if (mIsVisibleByAlpha && finalAlpha > 0.001f && shader != null)
{
bool hadVertices = geometry.hasVertices;
//是否允许填充顶点信息
if (fillGeometry)
{
//清空顶点信息
geometry.Clear();
//填充顶点信息
OnFill(geometry.verts, geometry.uvs, geometry.cols);
}
//是否有丁点
if (geometry.hasVertices)
{
if (mMatrixFrame != frame)
{
//通过计算得到相当于父Panel的矩阵
mLocalToPanel = panel.worldToLocal * cachedTransform.localToWorldMatrix;
mMatrixFrame = frame;
}
//把当前的顶点坐标 转换为相对于父Pane的顶点坐标
geometry.ApplyTransform(mLocalToPanel);
mMoved = false;
return true;
}
return hadVertices;
}
else if (geometry.hasVertices)
{
if (fillGeometry) geometry.Clear();
mMoved = false;
return true;
}
二. OnFill() 方法,填充顶点信息:计算出顶点信息,然后把顶点信息填充到geometry里面,不过在这里OnFill是空的.因为每种组件计算顶点的方式都不一样,所以OnFill由子类来实现.任何几何和渲染属性(比如锚点,大小,颜色,Alpha,位置)发生变化,都会导致这个方法被调用,通常这个方法也是最消耗cpu的.特别是一些Tween动画会导致OnFill反复调用,所以建议附加在UI上的动画时间不宜过长。感觉这个地方优化空间还是挺大的。
UIGeometry:用来保存顶点信息的类,这个类很简单,主要属性有:
public BetterList<Vector3> verts = new BetterList<Vector3>();//保存顶点位置信息
public BetterList<Vector2> uvs = new BetterList<Vector2>();//保存UV坐标
public BetterList<Color32> cols = new BetterList<Color32>();//保存颜色信息
原文地址:http://www.cnblogs.com/rocky300/articles/4675817.html