首页 > 代码库 > [cb]NGUI系列 UIWidget
[cb]NGUI系列 UIWidget
在NGUI中UIWidget是所有组件的基类,它承担了存储显示内容,颜色调配,显示深度,显示位置,显示大小,显示角度,显示的多边形形状,归属哪个UIPanel。这就是UIWidget所要承担的内容。在UIWidget的所有子类中都具有以上相同的属性和任务。UIWidget和UIPanel的关系非常密切,因为UIPanel承担了UIWidget的所有渲染工作,而UIWidget只是承担了存储需要渲染数据。所以,在UIWidget在更换贴图,材质球,甚至更换UIPanel父节点时它会及时通知UIPanel说:"我更变配置了,你得重新获取我的渲染数据"。
打开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();//多变形实例
在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) { }
下面是主程写的一个UIColorQued的NGUI小插件 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(); } }}
<style></style>
[cb]NGUI系列 UIWidget
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。