[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 = ;//深度
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的更多相关文章
- 谈谈Ext JS的组件——组件基类:Ext.Component
概述 Ext.Component是所有Ext组件的基类,这在Ext.Component的API中第一句话就提到了.然后第二段说明了它包含的基本功能:隐藏/显示.启用/禁用以及尺寸控制等.除了以上这些基 ...
- WPF组件开发之组件的基类
之前在网上看到很多关于组件开发的资料,但真正可以用到框架内的却很少.今天贴出自己做的组件,并适合大部分框架的代码. 组件开发需要先做出组件的基类,然后由其他的各类组件去继承这个基类,下面是组件基类的代 ...
- 【Unity3D基础教程】给初学者看的Unity教程(二):所有脚本组件的基类 -- MonoBehaviour的前世今生
作者:王选易,出处:http://www.cnblogs.com/neverdie/ 欢迎转载,也请保留这段声明.如果你喜欢这篇文章,请点[推荐].谢谢! 引子 上一次我们讲了GameObject,C ...
- javascript组件开发之基类继承实现
上一篇文章大概的介绍了一下关于javascript组件的开发方式,这篇文章主要详细记一下基类的编写,这个基类主要是实现继承的功能 为什么要封装基类? 由于这次重构项目需要对各种组件进行封装,并且这些组 ...
- Filter组件开发中的SDK基类分析
DirectShow SDK提供了一套开发Filter的基类源代码.基于这些基类开发Filter将大大简化开发过程. 1.CBaseObject 大部分SDK类都从CBaseObject类(参见com ...
- 基于SqlSugar的开发框架循序渐进介绍(10)-- 利用axios组件的封装,实现对后端API数据的访问和基类的统一封装处理
在SqlSugar的开发框架的后端,我们基于Web API的封装了统一的返回结果,使得WebAPI的接口返回值更加简洁,而在前端,我们也需要统一对返回的结果进行解析,并获取和Web API接口对应的数 ...
- C#之基类及接口
Component类: Component是公共语言运行库中按引用封送的所有组件的基类.Component提供IComponent接口的基实现并启用应用程序之间的对象共享. https://msdn. ...
- (转) C++中基类和派生类之间的同名函数的重载问题
下面有关派生类与基类中存在同名函数 fn: class A { public: void fn() {} void fn(int a) {} }; class B : public A { publi ...
- 基于MVC4+EasyUI的Web开发框架形成之旅--基类控制器CRUD的操作
在上一篇随笔中,我对Web开发框架的总体界面进行了介绍,其中并提到了我的<Web开发框架>的控制器的设计关系,Web开发框架沿用了我的<Winform开发框架>的很多架构设计思 ...
随机推荐
- xmapp的安装
搭建网站常识性的你首先得搭建一个服务器. 首先APACHE是世界使用排名第一的WEB服务器软件,但是安装APACHE WEB服务器并不容易.如果你想添加MYSQL.PHP和PERL,那就更难了.所以可 ...
- (七)play之yabe项目【CRUD】
(七)play之yabe项目[CRUD] 博客分类: 框架@play framework 增加CRUD功能 使用CRUD能干嘛?----> 在页面对模型进行增删改查操作,这样有什么实际意义 ...
- 一个Chrome拓展——HttpPost
周末花了点时间做了一个chrome拓展,叫HttpPost,顾名思义是用来测试http的post请求. 先直接看效果 插件与拓展 在说这个做的过程前,先说明什么是Chrome插件.Chrome拓展 1 ...
- 卸载WIN10自带功能
要卸载OneNote,在里面输入 Get-AppxPackage *OneNote* | Remove-AppxPackage 可以复制,回车执行 4 要卸载3D,输入 Get-AppxPackage ...
- 安卓开发-See the log file\.metadata\.log.
今天在给安卓项目res-valus-string.xml 中字符串修改的时候,突然eclipse卡住了 然后任务管理器关掉之后,重新打开 显示一个错误 百度了一下 eclipse启动报错,让查看.me ...
- IOS 网络浅析-(六 网络图片获取之三方SDWebImage)
网络图片获取是大多数app所能用到的,由于实际app开发中原生api很少用到,在这里就先不介绍了,以后有时间会给大家介绍.这篇文章会给大家介绍一个三方-SDWebImage.SDWebImage 是一 ...
- 【原】UIView实现点击着重效果的解决方案
我们知道,在IOS中UIButton UIControl都有一个默认的选中效果,即点中后会图标会变暗,移开后又恢复正常.如何让UIView UIImageView等这些普通的view也实现同样的效果呢 ...
- iOS开发 使用RMStore简化内购代码 + 内购买订单验证
现在很多的app里面都添加了应用内购买,网上关于苹果证书的生成和设置的教程比较多,这里就不多赘述了,推荐几个个人觉得说的比较详细的网址: http://www.jianshu.com/p/86ac7d ...
- iOS开发之NSTimer使用初探
创建一个定时器(NSTimer) - (void)viewDidLoad { [super viewDidLoad]; [NSTimer scheduledTimerWithTimeInterval: ...
- OC语言-01-面向过程与面向对象思想
一.面向过程 1> 思想 面向过程是一种以过程为中心的最基础编程思想,不支持面向对象的特性. 面向过程是一种模块化程序设计方法 2> 开发方法 面向过程的开发方法是以过程(也可以说是模块) ...