[cb]NGUI组件基类之 UIWidget

简介:



UIWidget     

NGUI的UIWidget是所有组件的基类,它承担了存储显示内容,颜色调配,显示深度,显示位置,显示大小,显示角度,显示的多边形形状,归属哪个UIPanel。这就是UIWidget所要承担的内容。在UIWidget的所有子类中都具有以上相同的属性和任务。UIWidget和UIPanel的关系非常密切,因为UIPanel承担了UIWidget的所有渲染工作,而UIWidget只是承担了存储需要渲染数据。所以,在UIWidget在更换贴图,材质球,甚至更换UIPanel父节点时它会及时通知UIPanel说:"我更变配置了,你得重新获取我的渲染数据"。

UIWidget源码分析

打开UIWidget.cs可以看到如下代码:

复制代码
    [HideInInspector][SerializeField] protected Material mMat;//材质

    [HideInInspector][SerializeField] protected Texture mTex;//贴图

    [HideInInspector][SerializeField] Color mColor = Color.white;//颜色

    [HideInInspector][SerializeField] Pivot mPivot = Pivot.Center;//对齐位置

    [HideInInspector][SerializeField] int mDepth = 0;//深度

    protected Transform mTrans;//坐标转换

    protected UIPanel mPanel;//相应的UIPanel

    protected bool mChanged = true;//是否更改

    protected bool mPlayMode = true;//模式

    Vector3 mDiffPos;//位置差异

    Quaternion mDiffRot;//旋转差异

    Vector3 mDiffScale;//缩放差异

    int mVisibleFlag = -1;//可见标志

    // Widget's generated geometry

    UIGeometry mGeom = new UIGeometry();//多变形实例
复制代码

OnFill

    在UIWidget中最重要的方法就是OnFill(),这是更新渲染多边型的方法。

复制代码
 /// <summary>

/// Virtual function called by the UIPanel that fills the buffers.
/// </summary>

virtual public void OnFill(BetterList<Vector3> verts, BetterList<Vector2> uvs, BetterList<Color32> cols) { }
复制代码

 

ColorQuad组件

下面是我们封装的一个组件写 UIColorQuad.cs

复制代码
/// Author: KK
/// 
using UnityEngine;
using System.Collections;

/// <summary>
/// 纯色正方形,使用两个三角形组成,仅4个顶点
/// </summary>
[ExecuteInEditMode]
[AddComponentMenu("NGUI/AC-Plugins/ColorQuad")]
public class UIColorQuad : UIWidget
{
    /// <summary>
    /// 用于纯色矩形渲染的材质, 独立,不共享
    /// </summary>
    private static Material m_UIColorQuadMaterial = null;  // 静态,唯一,共享

    public override Material material
    {
        get { return UIColorQuad.m_UIColorQuadMaterial; }
    }

    protected override void Awake()
    {
        base.Awake();
    }
    protected override void OnStart()
    {
        base.OnStart();
        mChanged = true;  // Start时让其重新渲染一次,否则在客户端会加载后没东西
    }

    public void SetSize(float _widht, float _height)
    {
        base.width = (int)_widht;
        base.height = (int)_height;
        base.mChanged = true;
    }

    /// <summary>
    /// 负责显示内容,它的工作是填写如何显示,显示什么。就是把需要显示的内容存储在UIWidget
    /// </summary>
    /// <param name="verts"></param>
    /// <param name="uvs">显示的多边形形状</param>
    /// <param name="cols">颜色调配</param>
    public override void OnFill(BetterList<Vector3> verts, BetterList<Vector2> uvs, BetterList<Color32> cols)
    {
        // 开始画网格, 顶点, 矩形
        Vector3[] arrVerts = localCorners;  // 直接由4个角组成矩形吧
        for (int i = 0; i < arrVerts.Length; i++)
        {
            verts.Add(arrVerts[i]);
        }

        // 贴图点
        for (int i = 0; i < arrVerts.Length; i++)
        {
            uvs.Add(new Vector2(0, 0));
        }

        // 顶点颜色
        Color pmaColor = NGUITools.ApplyPMA(this.color);  // NGUI PMA
        for (int i = 0; i < arrVerts.Length; i++)
        {
            cols.Add(pmaColor);
        }
    }

    // 创建材质
    void CheckQuadMaterial()
    {
        string szUseShaderName = "Unlit/Premultiplied Colored"; // NGUI的~

        if (UIColorQuad.m_UIColorQuadMaterial == null ||   // 下列情况下重新生成材质
            material == null ||
            material.shader == null ||
            material.shader.name != szUseShaderName
            )
        {
            GameObject.DestroyImmediate(UIColorQuad.m_UIColorQuadMaterial);

            UIColorQuad.m_UIColorQuadMaterial = new Material(Shader.Find(szUseShaderName));
            UIColorQuad.m_UIColorQuadMaterial.name = "UIColorQuadMaterial";

            // 生成一个1点的白色纹理
            Texture2D whiteTex = new Texture2D(1, 1);
            for (int y = 0; y < whiteTex.height; ++y)
            {
                for (int x = 0; x < whiteTex.width; ++x)
                {
                    whiteTex.SetPixel(x, y, new Color(1, 1, 1, 1));
                }
            }
            whiteTex.Apply();
            UIColorQuad.m_UIColorQuadMaterial.SetTexture("_MainTex", whiteTex);
        }
    }

    protected override void OnUpdate()
    {
        base.OnUpdate();

        if (mChanged)
        {
            mChanged = false;
            CheckQuadMaterial();
        }
    }
}
复制代码

本文转自赵青青博客园博客,原文链接:http://www.cnblogs.com/zhaoqingqing/p/3860236.html,如需转载请自行联系原作者
相关文章
|
4月前
|
iOS开发 UED 开发者
UIControl 功能和用法
UIControl 功能和用法
|
5月前
|
JavaScript
Vue子组件调用父组件方法并传参的5种方式:$emit触发、传入子组件function、访问父组件$parent.function、用inject关联父组件provide的方法、用window.fun
Vue子组件调用父组件方法并传参的5种方式:$emit触发、传入子组件function、访问父组件$parent.function、用inject关联父组件provide的方法、用window.fun
|
C# 图形学
Winform控件优化之Paint事件实现圆角组件(提取绘制圆角的扩展方法)
Paint事件方法中实现圆角控件不要通过事件参数`e.ClipRectangle`获取控件区域范围,原因见最后介绍;注意设置控件背景透明(参见[Winform控件优化之背景透明那些事2...
795 0
Winform控件优化之Paint事件实现圆角组件(提取绘制圆角的扩展方法)
UE4 动画蓝图的嵌套与继承
UE4 动画蓝图的嵌套与继承
127 0
|
前端开发
SwiftUI—使用ViewModifier视图修饰符集成多个样式
SwiftUI—使用ViewModifier视图修饰符集成多个样式
366 0
SwiftUI—使用ViewModifier视图修饰符集成多个样式
父组件调用子组件中的方法- this.$refs.xxx.子组件方法();
父组件调用子组件中的方法- this.$refs.xxx.子组件方法();
Qt-第一个QML程序-4-自定义按钮类,动画,状态
上篇中,我们写到了自己定义了一个按钮,但是呢,按照这样的写法,要写一个程序出来,那要累死了,所以,qml给我的感觉就是各种随便调用,所以了,可以自己写一个自己Button的qml,这样在以后用到了,就可以直接使用了。
413 0
Qt-第一个QML程序-4-自定义按钮类,动画,状态