Unity3D开发(八):NGUI之UILabel颜色渐变效果

向原创致敬http://blog.csdn.net/onerain88/article/details/19066961

1. UILabel简介

(1)UILabel支持类型

a.图字:是指根据某些工具,将游戏中需要用到的文字渲染到一张纹理上,并附其纹理信息(包括 id值,尺寸,间距等)。

b.字库字:是指直接载入ttf等字库文件,根据从ttf文件中读取的数据,生成纹理并渲染。

(2)UILabel基本属性

Font类型:上述介绍的图字和字库字(Bitmap与Dynamic)

Text:文本

Overflow:溢出时选项,包括所发,裁剪,扩充等

Spacing:间距

Max Lines:最大行数

Encoding:是否支持颜色和表情

Gradient:(默认关闭),颜色渐变效果

Effect:特效,包括描边,阴影

(UIWidget属性不在赘述)

2. UILabel 绘制

UILabel根据类型不同(图字,字库字),其组织顶点,uv,颜色的方式有所区别,主要区别在于字库字是Unity3d支持的,图字是NGUI实现的,过程大同小异,这次用图字举例,即UIFont(字库字请参考NGUIText.cs)

(本文不详细讨论NGUI中控件是怎样通过组织DrawCall顶点属性并渲染的,留到UIPanel和UIWidget中去分析,这里主要分析一下UILable是怎么组织顶点属性的)

(1)原理

本文以图字模式举例,前面已经介绍过了,图字的原理是将UI中所需要的文字合成到同一张纹理(也可以是多张),并附其每个字符的描述信息,目的在于渲染时可以得到文字的“uv”,根据属性中设置的位置确定其顶点“位置”,然后对其颜色属性的设置,可以确定每个顶点的“颜色”信息,这样,就满足了Shader对于顶点属性的基本要求,即位置,uv,颜色。

对于图字模式来说,其实和2d中常用的SpriteSheet很类似,只不过SpriteSheet中每个元素是Sprite帧,而图字纹理中是每个可能用到的字符。

(2)实现

图字模式的组织顶点属性的方法在

UIFont.Print(string text, BetterList<Vector3> verts, BetterList<Vector2> uvs, BetterList<Color32> cols)

(具体请参考源码,这里只给出步骤)

a.对于UILable中属性进行初始化赋值及简单元算,包括顶点属性(位置,uv,颜色),解析(颜色和表情)。

b.遍历文本中的每个字符,组织其顶点属性

c.先获取当前字符的BMSymbol信息(前文提到的字符描述信息)

d.位置:在原位置基础上加上偏移,宽高值(来源于BMSymbol,是生成图字纹理时设置生成的,对于每个字符不同)

e.uv:同上,根据BMSymbol

f.颜色:这个属性是根据在UILabel面板中的设置而来的,即前文设置的Gradient Bottom和Gradient Top,这里需要注意的是每个字符的高度不同,从而导致字符所在矩形的上下边界点颜色并不与设置Gradient Bottom和Gradient Top完全相同,而是根据字符的高度和行高插值出来的!代码如下

3. UILabel 中的 Gradient

效果如图

设置如第一幅图,Gradient Bottom设置为纯绿色(0,1.0,0,1.0f),Gradient Top设置为纯红色(1.0f,0,0,1.0f)。(PS: 只为举例,不代表个人审美)

其实相对于UILable的绘制,添加Gradient属性并不是什么难事,之前的NGUI只支持纯色(但是可变颜色)的文本,添加Gradient属性之后,即对字符的颜色根据字符信息,定位每个字符的颜色变化值(不是精确的属性中设置的纯绿色和纯红色,因为每个字符的高度不同,所以字符最上面和最下面的颜色为纯绿色和纯红色之间的某个值而不同),再由Shader插值出渐变的颜色效果。

时间: 2024-10-02 18:04:03

Unity3D开发(八):NGUI之UILabel颜色渐变效果的相关文章

Unity3D开发(一):NGUI之UIRoot屏幕分辨率自适应

原地址:http://blog.csdn.net/onerain88/article/details/11713299 NGUI在Unity3D游戏开发中非常常用,而NGUI对于每一个UI场景,都是以一个UIRoot为UI游戏对象树的根的,那么这个UIRoot是起什么作用的呢? 先简单看一下UIRoot中的基本属性 UIRoot游戏对象的属性只有4个,分别是缩放规则,手动高度,最小高度和最大高度 而正是这4个属性,将影响整个UI场景中整体的缩放比例,当设置好这4个属性之后,UIRoot游戏对象的

iOS开发系列之二 - UILabel 用法小结

// 初始化标签 UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(10, 100, 300, 150)]; // 设置标签文字 label.text = @"This is a test text.This is a test text.This is a test text."; // 设置标签文字字体 // 使用系统字体 label.font = [UIFont systemFontOfSize:20]; //

IOS开发学习笔记(1)-----UILabel 详解

1. [代码][C/C++]代码     //创建uilabelUILabel *label1 = [[UILabel alloc] initWithFrame:CGRectMake(20, 40, 280, 80)];//设置背景色label1.backgroundColor = [UIColor grayColor];//设置taglabel1.tag = 91;//设置标签文本label1.text = @"Hello world!";//设置标签文本字体和字体大小label1.

unity3d开发实战《啪啪三国》技术详解!

去年11月,上海火溶网络CEO王伟峰以其第一款3d手游产品<啪啪三国>为例,着重讲解了unity3D手机网游开发的经验,其中涉及了团队组成.人员要求.常见的unity3d开发遇到的坑及解决办法.在演讲中,王伟峰也贡献了<啪啪三国>开发过程中总结的各种经验,从优化.插件库.服务器架构.SDK等很多细节进行了讲解.值得一说的是,王伟峰现场演讲十分幽默,冷笑话段子不断爆出,让在场观众在连续的笑声中听完这个特别的技术演讲. <ignore_js_op> 以下是王伟峰现场演讲实录

GDI+学习之 ------- 绘制角度可变的颜色渐变效果

GDI+ 是GDI(Windows 早期版本提供的图形设备接口)的后续版本,是Microsoft Windows XP作系统即后续版本的图形显示技术.它已经集成到了.Net开发环境中,所以不管你的OS是什么版本,只要安装了.Net框架,就有了GDI+(注意:是.Net框架,而不是.Net开发环境,所以Win98中也可以使用GDI+). 现在,言归正传. 在头文件中加入下面的代码: #include <GdiPlus.h> using namespace Gdiplus; #pragma com

unity3d中的ngui的一些笔记

一. NGUI的直接用法 1. Attach a Collider:表示为NGUI的某些物体添加碰撞器,如果界面是用NGUI做的,只能这样添加.(注:用Component添加无效). 2. Attach an Anchor:表示为该物体添加了UIAnchor脚本,作用是避免像素偏移的问题 3. Attach UIStretch:表示为该物体添加了UIStretch脚本,提供缩放功能 4. Make Pixel Perfect:表示自动为你调整Transform的尺寸 5. Create a Pa

[Unity3D]Unity3D再叙NGUI之血条及技能冷却效果

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 喜欢我的博客请记住我的名字:秦元培,我的博客地址是blog.csdn.net/qinyuanpei. 转载请注明出处,本文作者:

Unity3D开发Windows Store应用程序 注意事项

原地址:http://blog.csdn.net/jbjwpzyl3611421/article/details/12704491 针对最近在移植window store项目中遇到的问题,我整理了官方说明, 在此和各位开发者分享,避免在移植过程中走弯路!     Platform status 平台现状   Currently if you want to build a Windows Store apps player, you have to do it on Windows 8, thi

李洪强iOS开发之动态获取UILabel的bounds

李洪强iOS开发之动态获取UILabel的bounds 在使用UILabel存放字符串时,经常需要获取label的长宽数据,本文列出了部分常用的计算方法. 1.获取宽度,获取字符串不折行单行显示时所需要的长度  CGSize labelBounds = [str sizeWithFont:font constrainedToSize:CGSizeMake(MAXFLOAT, 30)]; 注:如果想得到宽度的话,size的width应该设为MAXFLOAT. 2.获取高度,获取字符串在指定的siz