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();
}
}
}

[cb]NGUI组件基类之 UIWidget的更多相关文章

  1. 谈谈Ext JS的组件——组件基类:Ext.Component

    概述 Ext.Component是所有Ext组件的基类,这在Ext.Component的API中第一句话就提到了.然后第二段说明了它包含的基本功能:隐藏/显示.启用/禁用以及尺寸控制等.除了以上这些基 ...

  2. WPF组件开发之组件的基类

    之前在网上看到很多关于组件开发的资料,但真正可以用到框架内的却很少.今天贴出自己做的组件,并适合大部分框架的代码. 组件开发需要先做出组件的基类,然后由其他的各类组件去继承这个基类,下面是组件基类的代 ...

  3. 【Unity3D基础教程】给初学者看的Unity教程(二):所有脚本组件的基类 -- MonoBehaviour的前世今生

    作者:王选易,出处:http://www.cnblogs.com/neverdie/ 欢迎转载,也请保留这段声明.如果你喜欢这篇文章,请点[推荐].谢谢! 引子 上一次我们讲了GameObject,C ...

  4. javascript组件开发之基类继承实现

    上一篇文章大概的介绍了一下关于javascript组件的开发方式,这篇文章主要详细记一下基类的编写,这个基类主要是实现继承的功能 为什么要封装基类? 由于这次重构项目需要对各种组件进行封装,并且这些组 ...

  5. Filter组件开发中的SDK基类分析

    DirectShow SDK提供了一套开发Filter的基类源代码.基于这些基类开发Filter将大大简化开发过程. 1.CBaseObject 大部分SDK类都从CBaseObject类(参见com ...

  6. 基于SqlSugar的开发框架循序渐进介绍(10)-- 利用axios组件的封装,实现对后端API数据的访问和基类的统一封装处理

    在SqlSugar的开发框架的后端,我们基于Web API的封装了统一的返回结果,使得WebAPI的接口返回值更加简洁,而在前端,我们也需要统一对返回的结果进行解析,并获取和Web API接口对应的数 ...

  7. C#之基类及接口

    Component类: Component是公共语言运行库中按引用封送的所有组件的基类.Component提供IComponent接口的基实现并启用应用程序之间的对象共享. https://msdn. ...

  8. (转) C++中基类和派生类之间的同名函数的重载问题

    下面有关派生类与基类中存在同名函数 fn: class A { public: void fn() {} void fn(int a) {} }; class B : public A { publi ...

  9. 基于MVC4+EasyUI的Web开发框架形成之旅--基类控制器CRUD的操作

    在上一篇随笔中,我对Web开发框架的总体界面进行了介绍,其中并提到了我的<Web开发框架>的控制器的设计关系,Web开发框架沿用了我的<Winform开发框架>的很多架构设计思 ...

随机推荐

  1. spring mvc 框架搭建及详解

    现 在主流的Web MVC框架除了Struts这个主力 外,其次就是Spring MVC了,因此这也是作为一名程序员需要掌握的主流框架,框架选择多了,应对多变的需求和业务时,可实行的方案自然就多了.不 ...

  2. web安全——防火墙

    简介 用于实现服务器(Linux)的访问控制的功能的. 分硬件和软件防火墙. 主要是控制访问的流入和服务器的流出. 通过黑名单和白名单的思想来实现更细粒度的控制,这个一般结合其他的应用来定义策略实现. ...

  3. Android5.0新特性——兼容性(support)

    兼容性 虽然Material Design新增了许多新特性,但是并不是所有新内容对对下保持了兼容. 使用v7包 v7 support libraries r21 及更高版本包含了以下Material ...

  4. APP落地页开发中的一些小经验~

    在开发日常落地页的时候,每当碰到一些很酷炫的宣传图用css实现很复杂且耗时的时候,一般采取切图然后将其放在页面中,在这个过程中发现<img/>标签中图片下方会有一行小空白,影响了与后一部分 ...

  5. PHP写日志函数

    初学,写一个函数用于存储日志调试. function WriteLog($msg) { $filename = dirname(__FILE__) ."\\Debug.log"; ...

  6. img标签src不给路径就会出现边框————记一次二笔的编码经历

    <img/>在src加载失败或没有给的,浏览器会自动给img加上边框. 如下图这样: 产品觉得影响美观,一定要pass掉. 原码是这样: .ctn{ position: relative; ...

  7. Android Studio 使用小技巧

    1.如何打开设置界面? File --> Settings 快捷键  Ctrl + Alt  + s 2.修改Java文件字体大小 ? File --> Settings --> E ...

  8. Android项目实战(十一):moveTaskToBack(boolean ) 方法的使用

    当你开发的程序被按后退键退出的时候, 你肯定不想让他就这么被finish()吧,那么就想把程序退置到后台就可. (类似于PC端,你关闭一个浏览器和你最小化一个浏览器的区别) 参看方法:public b ...

  9. wxPython简单入门

    wxPython简介 wxPython 是 Python 语言的一套优秀的 GUI 图形库,允许 Python 程序员很方便的创建完整的.功能键全的  GUI 用户界面. wxPython 是作为优秀 ...

  10. STL--向量(vector)

    STL的组成 标准模板库STL关注的重点是泛型数据结构和算法,其关键组成部分是容器(containers).算法(algorithms).迭代器(iterators).函数对象(Function Ob ...