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;//相应的UIPanelprotected 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 PMAfor (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();}}
}

[cb]NGUI组件基类之 UIWidget相关推荐

  1. Android中所有UI组件基类是,【详细】Android入门到放弃篇-YES OR NO-》各种UI组件,布局管理器,单元Activity...

    问:达叔,你放弃了吗? 答:不,放弃是不可能的,丢了Android,你会心疼吗?如果别人把你丢掉,你是痛苦呢?还是痛苦呢?~ 引导语 有人说,爱上一个人是痛苦的,有人说,喜欢一个人是幸福的. 人与人之 ...

  2. 谈谈基类与子类的this指针(C++)

    引入 定义一个类的对象,首先系统已经给这个对象分配了空间,然后会调用构造函数(说明:假设存在构造函数).一个类有多个对象,当程序中调用对象的某个函数时,有可能要访问到这个对象的成员变量.而对于同一个类 ...

  3. Qt (高仿Visio)流程图组件开发(三) 图元基类如何定义,流程图多种图元类型实现

    文章目录 本系列目录 前言 一.图元基类的定义 1.图元信息基类结构体 2.图元位置 3.父子对象关系 二.自定义图元实现 1.自定义图元基类(FlowchartGraphicsItem)与Qt原生图 ...

  4. C++编程进阶6(public继承与组合、private继承、多重继承、处理模板基类内的名称、如何避免模板代码膨胀)

    二十一.public继承与组合 public继承是是子类对象is a基类对象的关系,比如QT中的所有组件类都要继承QObject,所以所有的QT组件都是一个QObject. 而组合是has a(包含) ...

  5. baseresponse响应类_内部类、响应类Response、序列化基类、反序列化、全局局部钩子...

    一.内部类 1.概念:将类定义在一个类的内部,被定义的类就是内部类 2.特点:内部类及内部类的所以名称空间,可以直接被外部类访问的 3. 应用:通过内部类的名称空间,给外部类额外拓展一些特殊的属性(配 ...

  6. ASP.NET Atlas简单控件介绍——Sys.Component基类与Sys.UI.Control基类

    作者:Dflying Chen (http://dflying.cnblogs.com/) 本系列有三篇文章: ASP.NET Atlas简单控件介绍--Sys.Component基类与Sys.UI. ...

  7. BIM工程信息管理系统-EF实体框架数据操作基类

    EF实体框架数据操作基类主要是规范增.改.查.分页.Lambda表达式条件处理,以及异步操作等特性,这样能够尽可能的符合基类这个特殊类的定义,实现功能接口的最大化重用和统一. 1.程序代码 /// & ...

  8. 私藏的开发过程中的那些基类

    Activity 说明: Activity基类 让子类方便的获取tag 让子类方便的getActvity 默认设置竖屏锁定 模版方法模式让子类可以方便的进行数据填充代码编写 findView让子类省去 ...

  9. Fixjs——显示容器基类DisplayObjectContainer

    <sdt id="89512093" sdtlocked="t" contentlocked="t" sdtgroup="t ...

最新文章

  1. koa mysql模块_koa 项目中引入 mysql
  2. 【BZOJ5102】[POI2018]Prawnicy 堆
  3. 学习笔记2——对象初始化和面向对象特性
  4. ubuntu虚拟机开机无法进入系统(initramfs)
  5. 按照这步骤来刷题,两个月你亦能成为王者
  6. 垃圾回收机制之标记压缩算法与分代算法
  7. curl 请求日志_HTTP入门(一):在Bash中curl查看请求与响应
  8. C51 动态数码管 个人笔记
  9. 实录:oracle下大表清理整改
  10. Linux之VMware Workstation16 pro上安装redhat
  11. C语言学习笔记-1(资料:郝斌老师C语言视频)
  12. 【原创】ESXI获取虚拟机的moid,并使用VMRC登录远程虚拟机
  13. web网页开发-前端
  14. 阿里云中标“金关工程二期”大数据云项目,总金额8568万!(含标单)
  15. extern关键字作用
  16. MySQL中的自增主键用完了怎么办?
  17. Android 系统(93)---android 怎么判断手机号是移动还是联通还是电信
  18. 模拟鼠标键盘操作,含硬件模拟技术。
  19. EXCEL表格-根据身份证号计算性别、年龄(IF、MOD函数)
  20. MSCode微服务平台框架基于SpringCloud、SpringCloud Alibaba、SpringBoot和Activiti7工作流,快速开发办公OA、CRM、ERP、电商、信息管理等业务系统

热门文章

  1. Python多线程threading用法
  2. 【算法学习笔记】57. 前缀树 字典序优化技巧 STL学习 SJTU OJ 1366 前缀匹配
  3. Android设计模式系列(2)--SDK源码之观察者模式
  4. 检查单 2014-06-20-01
  5. 纯数学教程 Page 203 例XLI (1)
  6. 从GNOME切换到KDE了
  7. 启用Windows 7/2008 R2 XPS Viewer
  8. instanceof与typeof 运算符
  9. [导入]金山词霸2005精简版下载地址
  10. 与Brian Goetz聊Java的数据类