NGUI源码分析(二) UIWidget

UIWidget作为UI组件基类,负责计算与渲染相关的属性。关键属性包括锚点、颜色、大小等,核心方法UpdateGeometry更新顶点信息,OnFill填充顶点细节。UIGeometry保存顶点、UV、颜色信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值