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 = ;//深度

    protected Transform mTrans;//坐标转换

    protected UIPanel mPanel;//相应的UIPanel

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

    protected bool mPlayMode = true;//模式

    Vector3 mDiffPos;//位置差异

    Quaternion mDiffRot;//旋转差异

    Vector3 mDiffScale;//缩放差异

    int mVisibleFlag = -;//可见标志

    // 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 = ; i < arrVerts.Length; i++)
{
verts.Add(arrVerts[i]);
} // 贴图点
for (int i = ; i < arrVerts.Length; i++)
{
uvs.Add(new Vector2(, ));
} // 顶点颜色
Color pmaColor = NGUITools.ApplyPMA(this.color); // NGUI PMA
for (int i = ; 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(, );
for (int y = ; y < whiteTex.height; ++y)
{
for (int x = ; x < whiteTex.width; ++x)
{
whiteTex.SetPixel(x, y, new Color(, , , ));
}
}
whiteTex.Apply();
UIColorQuad.m_UIColorQuadMaterial.SetTexture("_MainTex", whiteTex);
}
} protected override void OnUpdate()
{
base.OnUpdate(); if (mChanged)
{
mChanged = false;
CheckQuadMaterial();
}
}
}
05-11 17:01