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. 深入理解MySQL开发性能优化.pptx

    深入理解MySQL开发性能优化.pptx,依旧上传baidu pan http://pan.baidu.com/s/1jIwGslS,视频暂未出,培训完成后会更新.

  2. web安全——系统(Linux)

    简介 最小(少)原则,是安全的重要原则.最小的权限,最小的用户,最少的服务,最少的进程,是最安全的. 系统安全包括:文件系统保护.用户管理安全.进程的保护以及日志的管理. 场景 确保服务最少,每个都是 ...

  3. java分派

    变量被声明时的类型叫做变量的静态类型(Static Type) 又叫明显类型(Apparent Type).变量所引用的对象的真实类型又叫做变量的实际类型(Actual Type). 根据对象的类型而 ...

  4. ASP.NET MVC another entity of the same type already has the same primary key value

    ASP.NET MVC项目 Repository层中,Update.Delete总是失败 another entity of the same type already has the same pr ...

  5. .NET破解之百分百营销软件系列

    今天在52中看到了一个邮件批量发送工具,感觉不怎么好用,百度一下,找到了百分百系统,虽然也不怎么好用,但还是忍不住P它. 官网:http://www.100qunfa.com/ 百分百不加群提取群成员 ...

  6. 使用Reflexil修改类库

    因为公司一个项目需要修改PPS的颜色,于是反编译了PPS的代码发现,作者很不厚道的把所有着色都HardCode在代码里 private static void InsertDefaultSeriesC ...

  7. Apache服务器的URL重定向

    前端时间要整个Apache重定向功能,在此记录一下. 一.安装Apache Windows版本官方下载安装文件httpd-2.2.21-win32-x86-openssl-0.9.8r,选择安装目录, ...

  8. Java 中Comparator 的使用,实现集合排序

    目标:实现对Person 对象的年龄,从小到大排序 1.实现排序 package com.app; import java.util.ArrayList; import java.util.Colle ...

  9. iOS开发之网络数据解析(二)--XML解析简介

    前言:本篇随笔介绍的是XML解析. 正文: 1.XML解析方式有2两种: DOM:一次性将整个XML数据加载进内存进行解析,比较适合解析小文件 SAX:从根元素开始,按顺序一个元素一个元素往下解析,比 ...

  10. iOS-UI分析利器--Reveal安装破解以及简单使用

    前言:在 iOS 开发中,我们有时很希望有一款类似 Web 开发中的 UI Debug 工具(例如:Firebug),让我们能够实时查看 UI 的结构,还可以实时更改某个 UIView 的位置和大小的 ...