zoukankan      html  css  js  c++  java
  • [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();
            }
        }
    }
  • 相关阅读:
    重新整理 .net core 实践篇————配置系统之盟约[五]
    重新整理 .net core 实践篇————依赖注入应用之援军[四]
    重新整理 .net core 实践篇————依赖注入应用之生命法则[三]
    重新整理 .net core 实践篇————依赖注入应用[二]
    重新整理 .net core 实践篇————配置应用[一]
    spring cloud 学习笔记 客户端(本地)均衡负载(三)
    Leetcode之插入区间
    Leetcode之两棵二叉搜索树中的所有元素
    Leetcode之二叉树的层序遍历
    LeetCode之验证二叉搜索树
  • 原文地址:https://www.cnblogs.com/zhaoqingqing/p/3860236.html
Copyright © 2011-2022 走看看