NGUI(3) UIWidget
本篇文章和大家介绍的是NGUI中的基础组件UIWidget,UIWidget是所有UI组件的基类,持有UI组件的大小、锚点、顶点、颜色,Alpha等所有跟渲染相关的属性。
关键属性:
protected Pivot mPivot //锚点
protected Color mColor; //颜色
protected int mWidth;//组件宽度
protected int mDepth = 0;//显示深度,这个深度是相对于父节Panel的
public UIGeometry geometry;//Geometry对象用来保存顶点,位置,顶点UV,顶点颜色等信息
public UIDrawCall drawCall;//当前UIWidget所使用的绘制对象
protected bool mChanged = true;//记录所有几何和渲染属性是否发生变化 如果发生变化就要在UpdateGeometry里面重新计算顶点信息
public bool fillGeometry = true;//是否允许填充顶点信息
public override Vector3[] localCorners //get方法 获得UIWidget的4个顶点的局部坐标,顺序是:左下,左上,右上,右下
public override Vector3[] worldCorners//get方法 获得UIWidget的4个顶点的世界坐标系坐标,这个方法实际上就是将局部坐标转化为世界坐标
关键方法:
一、UpdateGeometry() 核心方法
更新UI组件的顶点信息。但是这里不并执行渲染,这个方法只是更新了UIWidget渲染所需要的数据,然后Panel会把这些数据传给DrawCall,让DrawCall执行渲染。简单说就是UIWidget负责计算数据,DrawCall把计算好的数据拿来渲染。
部分代码:
//获得通过计算的最终Alpha值,如果不为0要跟上层节点进行混合计算
float finalAlpha = CalculateFinalAlpha(frame);
//是否发生了变化
if (mChanged)
{
mChanged = false;
//如果Ahpha值大于最小值
if (mIsVisibleByAlpha && finalAlpha > 0.001f && shader != null)
{
bool hadVertices = geometry.hasVertices;
//是否允许填充顶点信息
if (fillGeometry)
{
//清空顶点信息
geometry.Clear();
//填充顶点信息
OnFill(geometry.verts, geometry.uvs, geometry.cols);
}
//是否有丁点
if (geometry.hasVertices)
{
if (mMatrixFrame != frame)
{
//通过计算得到相当于父Panel的矩阵
mLocalToPanel = panel.worldToLocal * cachedTransform.localToWorldMatrix;
mMatrixFrame = frame;
}
//把当前的顶点坐标 转换为相对于父Pane的顶点坐标
geometry.ApplyTransform(mLocalToPanel);
mMoved = false;
return true;
}
return hadVertices;
}
else if (geometry.hasVertices)
{
if (fillGeometry) geometry.Clear();
mMoved = false;
return true;
}
二、OnFill() 方法
填充顶点信息:计算出顶点信息,然后把顶点信息填充到geometry里面,不过在这里OnFill是空的。因为每种组件计算顶点的方式都不一样,所以OnFill由子类来实现。任何几何和渲染属性(比如锚点,大小,颜色,Alpha,位置)发生变化,都会导致这个方法被调用,通常这个方法也是最消耗cpu的。特别是一些Tween动画会导致OnFill反复调用,所以建议附加在UI上的动画时间不宜过长。感觉这个地方优化空间还是挺大的。
UIGeometry:用来保存顶点信息的类,这个类很简单,主要属性有:
public BetterList<Vector3> verts = new BetterList<Vector3>();//保存顶点位置信息
public BetterList<Vector2> uvs = new BetterList<Vector2>();//保存UV坐标
public BetterList<Color32> cols = new BetterList<Color32>();//保存颜色信息
NGUI(3) UIWidget相关推荐
- [cb]NGUI组件基类之 UIWidget
UIWidget NGUI的UIWidget是所有组件的基类,它承担了存储显示内容,颜色调配,显示深度,显示位置,显示大小,显示角度,显示的多边形形状,归属哪个UIPanel.这就是UIWidget所 ...
- NGUI所见即所得之深入剖析UIPanel,UIWidget,UIDrawCall底层原理
NGUI所见即所得之深入剖析UIPanel,UIWidget,UIDrawCall底层原理 By D.S.Qiu 尊重他人的劳动,支持原创,转载请注明出处:http.dsqiu.iteye.com 之 ...
- Unity性能优化方法总结
1 资源分离打包与加载 游戏中会有很多地方使用同一份资源.比如,有些界面会共用同一份字体.同一张图集,有些场景会共用同一张贴图,有些会怪物使用同一个Animator,等等.可以在制作游戏安装包时将这些 ...
- [UnityUINGU][UGUI]如何新建一个像《守望先锋》消息的信息框
<守望先锋>消息的信息框,微X的聊天框也可以. 使用Unity的NGUI,就必须用到UI 中的图片自己适应 文本的大小. 也就是说调整 文本的大小,或者是文本内的文字的行数,改变 对应的背 ...
- NGUI全面实践教程(大学霸内部资料)
NGUI全面实践教程(大学霸内部资料) 试读文档下载地址:链接:http://pan.baidu.com/s/1jGosC9g 密码:8jq5 介绍:NGUI全面实践教程(大学霸内部资料)本书是国内N ...
- Unity插件之NGUI学习(8)—— Table和NGUI尺寸转换为世界坐标系尺寸
依据 Unity插件之NGUI学习(2),创建一个UI Root,在UI Root下创建一个Texture作为背景图,并设置图片,在Wiget下调整大小:然后在UI Root下再创建一个Panel. ...
- 关于Unity中NGUI的背包实现之Scrollview(基于Camera)
基于UIPanel的scrollview实现方式在移动设备上的性能不如基于camera的方式. 因为UIPanel的scrollview实现方式要渲染很多的道具图,性能自然就降低了. 如果是用第二个摄 ...
- Unity+NGUI性能优化方法总结
原文地址:http://blog.csdn.net/zzxiang1985/article/details/43339273 一共9招. 1 资源分离打包与加载 游戏中会有很多地方使用同一份资源.比如 ...
- NGUI渲染机制——从顶点和UV说起
相信来到这里的你和我一样好奇NGUI是如何将我们的原始输入加工成为最终呈现出来的样子的,一言以蔽之,这个过程就是生成顶点.UV.颜色等数据并将它们传入Mesh中使用MeshRenderer进行渲染,但 ...
最新文章
- Openoffice 安装与配置
- 泰坦尼克号数据_看完泰坦尼克号生还数据之后,你还会认为是妇女和儿童先走吗?...
- 4.QPixmap,QTransform,绘图函数的使用
- Boost asio学习笔记之二—— 网络编程
- OSPF 多进程实验(1)
- mcq 队列_基于人工智能的智能体能力倾向问答(MCQ) 套装1
- emoji表情引发的JNI崩溃
- python WindroseAxes 报错 has no attribute ‘Appender‘
- css 实现16:9比例自适应手机尺寸,可设置任意比例
- SpringMVC扩展
- ORB_SLAM3_一张图说明ORB-SLAM中的ORB特征提取和图像匹配算法流程
- 深圳宝安学区房_查查吧深圳学区地图
- Windows 下利用cWrsync同步
- 计算机带来好处坏处的英语作文,关于电脑的好处与坏处的英语作文
- java编程进阶类_进阶Java编程(9)反射与类操作
- gcc编译出错collect2: error: ld returned 1 exit status的解决办法
- C# - 2017微软校园招聘笔试题 之 MS Recognition[待解决]
- Unicast RPF,单播逆向转发
- 电脑键盘上的灰尘如何清除
- TDOA的matlab仿真