[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开发框架>的很多架构设计思 ...
随机推荐
- 解决SlidingMenu和SwipeBackLayout右滑事件冲突问题
SwipeBackLayout向右滑动关闭当前Activity,SlidingMenu向右滑动则是打开menu部分.在同一个Activity中,当SlidingMenu处于打开状态时,此时向右滑动,事 ...
- Android5.0新特性——新增的Widget(Widget)
新增的Widget RecyclerView RecyclerView是ListView的升级版,它具备了更好的性能,且更容易使用.和ListView一样,RecyclerView是用来显示大量数据的 ...
- ng-show
//当ng-show="false"时,自动添加 #animate.ng-hide { } #animate.ng-hide-add { } #animate.ng-hide-ad ...
- vsphere vcenter server下安装ubuntu的vmwaretools
0.参考文献 百度经验:这里面是以redhat桌面版为实例进行介绍的,我的环境是ubuntu-server,虽然不一样,也可以参考 http://jingyan.baidu.com/article/2 ...
- Android WebView 获取网页的标题
final TextView txtTitle = (TextView) findViewById(R.id.txtTitle); final WebView webView = (WebView)f ...
- iOS面试中常见的算法题目
一.前言 这里是在iOS求职中自己遇到的算法题,希望对大家有所帮助.不定期更新.如果大家想在线运行代码调试,可以将代码拷贝到这里.然后进行调试.下面就是常见的算法题目. 二.正文 1.就n的阶乘.(这 ...
- CSS 属性选择器(八)
一.属性选择器 属性选择使用中括号进行标识,中括号内包含属性名,属性值或者属性表达式 如h1[title],h1[title="Logon"], 二.属性选择器分类 2.1.匹配属 ...
- iOS- 利用AFNetworking3.0+(最新AFN) - 实现文件断点下载
官方建议AFN的使用方法 0.导入框架准备工作 •1. 将AFNetworking3.0+框架程序拖拽进项目 •2. 或使用Cocopod 导入AFNetworking3.0+ •3. ...
- OC语言-08-深拷贝与浅拷贝详解(示例)
概述 拷贝:复制一个与源对象内容相同的对象 实现拷贝,需要遵守以下两个协议 NSCopying NSMutableCopying 拷贝返回对象的种类 可变,mutableCopy消息返回的对象 不可变 ...
- js检测浏览器型号
公司要求做内部统计,要求监控客服玩游戏使用的浏览器的型号,是火狐的.谷歌的.还是IE的等等. [code lang="javascript"] /**** * 目前识别范围 * M ...