由于之前刚入门的时候,应Unity3d整体发展的要求我们自学了UGUI(相对来说UGUI比NGUI做得更好一些,后面会有2者对比),但是后来公司要求使用NGUI,所以我这边把之前学习UGUI(不全,当时资源有限)和NGUI的学习心得什么的整理一下。学习UI,基础差的看一些教程,基础好的可以直接查看官方案例,根据案例上的相关功能自己做,有什么不懂的参数或者小知识网上问一下,向他人请教也是可以的。
一、NGUI
这段时间学习了一下,NGUI,个人觉得还不错,它的延伸资源比较多,毕竟存在的时间更久,功能更完善一些,还有现在大多数公司还是使用NGUI,转型比较麻烦。
NGUI我是看着教程学的,一部比较经典的教程:
(Unity插件之NGUI 完整视频教程)原教程:http://www.taikr.com/course/34?tkugui#01
个人学习:
1.首先将Options里面的Reset Prefebs toolbar,
这里面的控件可以直接拖出来用,自己做的控件也可以
制作成prefeb拖进去用
2.之前饱受困扰的在scenes场景里的相机图片,可以在
gizmos里面隐藏起来
!3.为什么视频里说将UIRoot的脚本展开就可以右键来
创建了,但其实并没有什么用
一、Label:
1.和UGUI一样,字体大小同样受限于label本身的大小,
字体大小超出控件大小,会进行自适应
2.字体有两个属性:
(1)NGUI字体:
NGUI有一个字体制作器(NGUI-Open-Font Maker)
,在这边制作的字体要选择NGUI属性
(2)unity字体:
选择动态字体,ttf,系统内置的
3.和UGUI一样,NGUI里面输入中文可能不太行,得先
在记事本里面写完再复制上去
4.字体大小与控件大小的自适应是在Overflow里面设置
的,和UGUI差不多
(1)shrink收缩(类似自适应)
(2)clamp将所写的string进行裁剪,在控件框外面自动
裁剪
(3)resize freely:将控件大小和文字大小保持一致
(4)resize height:如其所说,高度不固定,宽度固定
5.换行的地方在text处,NGUI直接回车,UGUI忘了试了,
但是程序在string中加入\n换行符还是可以起作用的
6.Alignment:对齐方式里面,有justified自动扩展字间距
使整个test与控件保持一致(只对英文起作用)
7.Gradient:颜色渐变,应该是NGUI独有的,就是字体
从上往下渐变,设置top颜色,然后bottomm颜色,自行渐变
8.Effect:text带的效果,shadow阴影,outline外部轮廓
9.Color Tint:字体颜色
10.要实现打字机的效果在label上增加一个脚本(NGUI自带的)
Fade In Time:就是有种写出来的感觉,慢慢显现出来
keep full dimension:就是是其保持完整的尺寸,未勾选上会有
一行的字不断往上移动的感觉,勾选完后就只是按设置好的位置
一个个出现
二、Sprite:
精灵显示图片用的
Altas就是图集,精灵就是其中的一块图片,
Altas图集可以在Open-Altas Maker制作
(1)Type:这里面和UGUI里讲的差不多
(2)Flip:就是各个方向翻转
三、Panel
面板
和UGUI里面差不多,类似于容器,用于分类,统一操作
和创建一个空的go差不多,
但是NGUI的panel带属性:
(1)Alpha,可以调整整体透明度
(2)Depth:这个属性UGUI不具有,UGUI只是随生成的顺序
来调节深度的,这点很麻烦,做一些操作做不到,有这个属性
会变得更简便很多
(3)Cliping:指定显示panel的某个部分,类似flash里面的
遮罩
这里面的Texture mask不太了解什么意思,教学视频没有这个
选项,个人觉得是类似于ps里面蒙版的作用,用texture遮盖
原sprite的纹理,但是透明度太低了,完全看不到效果
constraint but dont clip:设置大小,但是不要裁剪
四、Button
按钮
1.可以是label,sprite,只要增加一个点击的功能就行
2.要实现按钮功能,首先要在attach-collider给控件添加
一个collder,用来接收点击信息,然后再添加一个
buttonScript脚本,来处理点击消息响应
3.和UGUI一样,按钮有四种状态,和UGUI类似
4.消息响应也是类似于UGUI,都是将脚本挂在在一个go上,
然后将go拖拽进按钮响应事件里,并且将里面响应的方法
改为对应的方法
5.如果想将子控件(比如说父控件为精灵控件,子控件为
lable控件),想同时改变2者根据点击,停留等的响应
变化,可以在父控件上再增加一个UIButton脚本,将target
改为子控件。
其实在父控件上再加一个UIButton脚本,和在子控件上加一个
脚本差不多,但是会有问题就是,当添加UIButton脚本运行
的时候会自动添加一个TweenColor脚本,每当一个控件上有
一个UIButton脚本的时候都会带一个,所以都放在父控件上
的好处就是只会带上一个,而不是父子控件上都会带上(
经试验证明是这样,但是事实是怎么又待考证)
五、Atlas
创建图集:
Open-Atlas Maker(图集编辑器)
1.选择new
2.选择要制作成图集的图片
3.create后会新生成3个文件
(这种方法类似于cocos里面的图片打包器)
4.以后使用这个图集就是使用创建出来的新文件中的Prefeb
5.如果想删除图集里面的某张图片的话,右键预制体用
Atlas Maker打开,然后叉掉完delete掉要删除的图片
6.要更新或者增加图片还是想之前创建的时候一样,之间打开
图集的Atlas Maker然后点击想要添加的图片,会显示update或者
add,然后点击Update/Add按钮就会自行更新
六、SlicedSprite
切图(九宫切图),这个在UGUI里面也有相应的操作,
1.概念:将某些图片拉大,他的边缘会虚化,用切图可以很好的
消除边缘虚化。
2.做法:
(1)将图片文件的Type改为Sliced
(2)点击图片的Edit键进行图片编辑
①Dimensions是制作图集自动生成无需更改的
②然后更改border(为什么我更改后无法还原)
切图在按钮上用的比较多,因为按钮一般不希望被修改边框,
特别是圆角的按钮,但问题是若是按钮是圆形的呢。
3.因为NGUI不像UGUI做slice图片那么直观,所以一开始可以先
把图片放大来看,然后在编辑里面调整border的大小,看不到拉伸即可
七、dynamicFont
动态字体制作和显示:
静态字体:比如有1000个汉字,就把这1000个汉字写到一个tff
文件里(速度比较快,缺点图片有限,只能有常用的汉字)
动态字体:
1.要有一个ttf的字体集
2.打开Font Maker:
里面type前两个是静态字体,Dynamic是动态字体
bold是加粗,Italic是倾斜
创建动态字体会影响性能(多创建一个DC),还有不能是图集的
一部分
八、Widget
UIRoot的锚点为,整个UI的中心
这个值里面的Pivot就是设置整个控件的锚点(这边定死了,不知道
能不能改成非单位的改动锚点,一般用不到)
深度值,一般情况下不会用相同的深度值
snap就是让图片变回它自身本来的大小
Aspect是宽度除以高度得到的值
九、Anchor
锚点(这边是锚点,为什么还要有上面widget里的pivot)
但是这边做起来其实和锚点没有什么关系
更像是屏幕自适应的一块
有2个Type:
1.Unified
事件发生的时间:
有3个时间段:
OnEnabled
OnStart
OnUpdate
依据需要更改
2.Advanced
比Unified高级,就是target可以有多个,而前者只有一个,
更加灵活
3.里面的上下左右分别是当前控件相对于目标控件的相对位置
一般自适应大小,将上下左右分别设置为target的上下左右+0
4.要做某个控件(比如小地图)使其中心位置不变,同时在整个
UIRoot改变(或者说屏幕分辨率改变的时候)控件大小不变
(直观看过去不变,不是相对大小不变),就要将Anchors的
上下相对于目标的上下的一个保持固定位置,左右同理。
十、Tween
补间动画
相比NGUI,UGUI没有自带的Tween动画,都是用DoTween插件来
实现Tween动画的(后面觉得DoTween还蛮好用就一直在游戏中
很多地方都有用到)
1.Tweener:
给控件attach-tween(等价于给控件增加脚本)
(UGUI不带这个,之前还写了一个用来
做类似于透明度变化的脚本,NGUI里实现的不错,比较完善)
这边做的比较完整
上面的参数比较清楚,直白,就不加说明
1.这边Animation Curve这个功能比较完善,还可以在变化曲线
中增加key修改变化曲线
2.这边有个Tween Group,动画编组暂时没讲解,个人觉得类似
于Sequence
3.Ignore TimeScale,这个功能蛮好,就是不和游戏的速率挂钩
,我觉得可以用协程实现该功能比较简单
4.Tween里面有一个Transform,这个脚本里面显示的是从一个Transform到
另一个Transform,勾选Parent when finish后,移动完后改控件的父对象
为to的Transform(起始位置为from trans的位置)
十一、Slider
控制声音大小,进度
注意:这边我想建立一个空的go然后在空go上挂载slider脚本,
添加coliider,然后将前后背景精灵作为它的子对象,拖入脚本中,
运行无法触发。所以不能将NGUI的一些响应放在go上
alpha:是指定Foreground的透明度
若想要将父对象sprite隐藏,直接将UISprite脚本的勾去掉
如果用sprite作为slider,一般不用指定bg。
若是要显示进度条(可以自己写事件),便捷的是NGUI已经做好了
此功能,将label拖入slider的响应消息事件框,然后将函数改为
SetCurPercent
steps:就是整个进度条大概分几步走完
可以在slider上添加一个Slider Color脚本(NGUI自带的),目的用来
做滑动条根据当前值的百分比来更改颜色(类似于windows程序设计课
上做的实验一样),精灵一般使用滑动条的前景
十二:Project
(一)tips
1.可以创建一个widget当做整体的容器
2.可以将自己做的UI控件拖入预制体,然后将预制体拖入对应的
Prefab Toolbar里面
3.给控件挂载脚本就是将脚本挂载的go拖入notify中与UGUI类似,
然后根据具体需要更换自己写的方法
4.为什么我这边游戏开始的时候挂载在控件上的脚本会自动执行一遍,
而视频中不会
*5.如何获取当前脚本里的函数所匹配的控件:
(1).引用(未讲,麻烦)
(2).直接用NGUI里面的,控件脚本.current来获取当前触发事件的控件,
可以进入该控件类型的脚本查看相关函数
(二)界面切换
1.给要切换的widget添加一个tween
(问题:如果给容器下的一个控件设置了anchor这边好像无法作用移动,
还有比如说那些自带动画的控件播放处就无法改变位置)
2.设置的public脚本可以将整个go拖进去
3.playForward和playReverse,虽然tween脚本播放完会自动enabled = false,
但是这两个函数会自动判断,并更改,所以不需手动判断更改
(三)技能CD
(这个学UGUI的时候有学,但是一下想不起来了)
1.使用遮罩来做
2.在sprite上创建一个一样大的sprite作为mask
3.将masksp的type改为Filled(这边默认Fill Dir的参数就可以实现,调整一下
masksp的颜色和透明度)
4.Invert Fill倒置填充
(四)页面:输入框
1.首先创建sprite,添加collider
2.添加inputfield脚本
3.在进行label大小与sprite匹配的时候,尽量不要改变控件的Transform大小,
改动widget大小就好,否贼在anchor进行匹配的时候就会不好匹配,最重要的
问题是label会被压缩
4.一般将overflow改为clampcontent
5.Input脚本里面默认是default,可以单行和多行转换,如果做单行用submit
(这边直接触发提交事件),多行用New Line
6.问题:太多行显示不完全
7.在多行输入中,若是要将起始输入处(或者说游标处)显示在左上角,可以
将label的锚点改为左上角
8.校验:
1.validation验证
(1)Alphanumeric:字母数字的组合
(2)UserName:禁止输入特殊符号,中文
(3)Password:可以输入任何值,显示*
(4)Name:适合英文名,不接受中文字符,首字母大写,接受空格
2.Character Limit字符个数限制
3.自己写校验:(此处为验证年龄)
(1)声明一个public UIInput input;
(2)在验证年龄函数中记录输入框的值sting sInput = input.value;
(3)然后声明一个存储年龄的int值,int iAge;
if(int.TryParse (sInput, out iAge))
{//对iAge进行判断,相应操作}
(4)将挂载该脚本的go拖入该input控件中的OnValueChange中,选择相应
函数
注意:(3)中要用Tryparse,因为当输入框有值改变的时候就会进行相应
操作,如果用int.Parse函数的话,如果输入的不是数字就会报错。还有教学视频中
直接用submit方法代替是不可取的,只是暂时代替而已。
(五)聊天系统
1.如何制作一个可拖拽的控件
(1)控件+collider
(2)在Add Component里找到脚本Drag Object
(3)将该控件拖入脚本的Target里
(4)Drag Effect:(拖动效果),会有一个势能的过程(类似于惯性),
就是拖动的完后会有一个减速的过程。
2.如何改变控件大小
(1)控件+collider
(2)在Add Component里找到脚本Drag Resize Script
(3)将要伸缩的控件拖入脚本的Target里
(4)还要做好自适应,否则会相对偏离
3.scroll bar(滚动条)
(1)创建一个bg将collider和Scroll Bar脚本挂载
在此sprite上
(2)在bg创建子一个sprite控件fg,用来做滑动条,不用添加collider,大小和bg一样
大
(3)fg拖入scroll bar脚本中,然后改动Direction你要移动的方向,
size为前景的size,value即为其
(4)scroll bar和slider的区别:
scroll可以显示text list
slider调节进度,音量大小
(5)文本列表:
①之前的label只显示固定长度,OverFlow要不然就是压缩字体,要不然
裁剪掉,要完整地显示全部的text就要使用TextList。
②使用textlist,label里面在执行之前写的文字会清空,所以要在
代码里面将文本添加进去
③增加了textlist脚本后,label有带collider就可以拖拽显示超出范围的
文本了
④Paragraph History:记录了可以存储的text行数
⑤style:
a.text:就是文本从上往下添加
b.chat:文本从下往上添加
4.问题:
(1)在做这些控件的时候,最好将要做的控件的各个组件放在一起(我一开始
是将每个种类的组件放一起,然后虽然更清晰,但是要找整个大控件,就变得
非常散)
(2)在做textlist的时候如果label上面不需要响应事件其实是不用加collider的
5.创建聊天系统基础设计
(1)创建背景,滚动条,显示文本框,输入文本框,拉伸按钮(可有可无),
提交按钮(移动端需要,PC端直接响应回车键)
(2)这些内容都有学过,设计布局做,然后自适应
(3)脚本内容响应:(此处只是关于输入显示在文本框上)
①首先在脚本里面获取UIInput控件,和UITextList控件(可用public拖入
或者在Awake里直接get到)
②写函数:
//这边是直接响应回车键
public void OnChatInput()
{
textList.Add (input.value);
input.value = string.Empty;
}
(六)背包系统
1.类似于之前的拖拽功能,此处只要将脚本改为Drag And Drop脚本就好
2.要实现判断item拖拽结束的位置和拖拽结束的时间要通过重写虚函数
来实现
3.重写OnDragDropRelease函数(此函数作用判断拖动物体释放后是否有
触碰到物体,并且返回触碰物体),作用的物体要加collider
4.将此脚本挂载在要拖动释放的物体上
5.创建n个背包格knapsackcell,布局好,写一个脚本来控制knapsack存放数据
6.教程里面做cell数据存放,声明一个go数组。
7.做控件拖拽后,位置矫正在重写的代码里面,重置拖动控件的父对象,并且把
本地坐标改为0(我之前写的是设为父对象坐标)
8.判断控件释放cell是否有物体并且进行交换,只要通过判断该cell的子数量即可
(我想的是维护一个表或数组来判断,这边没有必要,哪怕是获取该拖拽物品的信息
也可以通过名字来判断)
9.当拖动释放的cell里面有物品时,OnDragDropRelease中的参数为该物品,而不是
之前的cell了
10.视频中是直接用KnapSack脚本通过引用来管理label中物品的数量,我是直接通过获取
子物体得到label然后进行操作(效率低一些)
11.视频中使用自动叠加的方法,我做的是人为叠加的方法,基本上都会用到。
12.视频中还漏了一个小问题,如果拖拽到外面是会报错的,我这边有个存储值来记录其
移动前的位置。
private Vector3 vtCurPos;
void Awake()
{
vtCurPos = this.transform.position;
}
protected override void OnDragDropRelease (GameObject surface)
{
base.OnDragDropRelease (surface);
if(surface.tag == "KnapsackCell")
{
this.transform.parent = surface.transform;
this.transform.localPosition = Vector3.zero;
vtCurPos = this.transform.position;
}else if(surface.tag == "Item")
{
if(surface.name == this.name)
{
UILabel label = surface.GetComponentInChildren
int iNum = int.Parse(label.text) + int.Parse(this.GetComponentInChildren
label.text = iNum.ToString();
Destroy(this.gameObject);
}else
{
Transform parentTrans = this.transform.parent;
this.transform.parent = surface.transform.parent;
this.transform.localPosition = Vector3.zero;
surface.transform.parent = parentTrans;
surface.transform.localPosition = Vector3.zero;
}
}else
this.transform.position = vtCurPos;
}
tip:
①之前创建东西都是从1~n,但是如果要取go的name的标号来判断的时候
会比较麻烦,因为最后的int个数不一致,所以最好可能到多少位就统一写多少位
②
a)int.Parse是转换String为int
Convert.ToInt32是转换继承自Object的对象为int的.
比如你得到一个object对象,你想把它转换为int,用int.Parse就不可以,要用Convert.ToInt32,
b)Convert.ToInt32(string) 方法遇到空时会返回0,而Int.Parse则会Throw Exception.
还可以使用Int32.TryParse方法更加安全。
(七)血条
1.做法类似于slider,不加collider而已
2.显示的是血量,一般用当前血量/总血量,百分比较少
3.导入NGUI_HUD_TEXT包
4.血条人物跟随:在血条上添加脚本UIFollowTarget,拖入跟随物体,
拖入带MainCamera标签的camera,还有UIRoot下的camera
5.因为血条一直跟随物体的中心点,我们所要跟随的go下创建一个空
go来代替之前的target,将再将此go拖拽到要显示跟随物体的某个位置
6.一般做血条,先创建一个widget用来挂载脚本(process和followtarget),
然后创建前景和背景,分别拖入。(这个容器可以用sprite,不想让它显示
图片将Atlas设置为null)。这样以容器挂载脚本就可以响应物体从渲染摄像机
下消失将容器下的控件都禁用,而不会产生前景消失背景还留着。(容器也可以
用一个空的go来代替)
7.disable if invisible:在go移出屏幕外,就将血条禁用,提高性能,节省开销
(禁用的只是挂载脚本下的子控件)
8.做文字(名称)跟随类似于做血条的步骤
9.显示伤害或治疗效果:在一个空的go上添加HudText脚本,在true type font上
添加动态字体然后在添加一个自己写的脚本MyHudText,在MyHudText脚本里面获取
到HudText hudText,然后在响应事件里面加入hudText.Add();里面三个参数,
第一个是失去或者增加的血量,二是血量的颜色,三是存在的时间,显示的位置在go的位置
(在某段时间里面多次响应事件,数值会自动累加)
10.运行时显示的血量是在该空go下创建生成的label(多显示的才会创建),
该label不会自动destory
11.HudText的参数解析:Gradient里面就是NGUI里面的渐变字体
该脚本的参数和NGUI里面的参数差不多
重点:
Offset Curve:偏移曲线
Alpha Curve:透明度曲线
Scale Curve:大小曲线
都是类似于Tween的操作,可以更改曲线
tip:
1.导入新的插件包,在打包前把包内examples以及一些无用的资源删了,以免打包会把这些资源打包进去
2.更改Tween曲线在曲线上右击可以添加Key,端点处右击类型可以更改该Tween的类型
3.UIFollowTarget可以让任意一个控件跟随一个3维世界里面的物体移动
4.类似于MyHudText这样的响应事件的脚本最好挂载在触发事件的go上
十三、音效
2.给按钮点击添加声音可以在改控件下添加PlaySound脚本
(NGUI自带的),声音NGUI有自带几个,可以在点开后,左下角小喇叭
可点击预览
3.pitch,查的是音高,视频中讲解为速度
4.新版的NGUI添加了几个声音的触发触发时间
5.OnClick在按钮上点击后,在按钮外释放不触发声音
OnClick是OnPress和OnRelease的集合
十四、游戏参数
1.音乐大小
2.游戏难度
3.操作方法
4.是否全屏
十五、PopupList
下拉列表,弹出列表
1.在创建完sprite后给精灵加collider后加PopupList脚本
改变其弹出列表
2.当要在sprite上显示其当前选中文字的时候,给sprite上添加
一个label,然后将label拖入OnValueChange,选择方法SetCurSelection
(类似于显示百分比的方法),NGUI已经做了很多工作,让制作UI更为便捷,
像UGUI类似于这种问题得自己写脚本实现这些功能
3.popuplist里面的background,HighLight是指弹出的下拉框的背景,
前景的图片和颜色
4.Animated:开启后会有下拉框的弹出动画效果,以及换选别的选项的跟随效果
5.padding:行距和边距
*6.在存储的文本里面修改枚举类型,使用判断语句或者switch,case,并且
在判断的时候将current.value.Trim();(将最后的换行符去掉)(自己做的
时候想能不能强制转化,发现不行,后面看了下教程,用判断做,后面再测试
的时候还以为是中文不能匹配,自己想到了是因为换行的问题,然后在case字符串
后加换行符,发现不行,看教程后改用Trim函数)
若还是不能显示中文,有可能是改字体不支持中文
不知道为什么我的unity3d是不是有bug,无法在scene上通过右键来
创建控件等,还有就是创建任何与label有关的控件,起始的字体总是
为空,导致一些控件无法响应
十六、CheckBox
单选框
sprite-collider-togglescript
1.UISprite:当选择的时候显示,不选择的时候隐藏(starting state
起始显示)
2.Transtion:Smooth平滑的显示,透明度递增;Instant,立即显示
二、UGUI
个人觉得用起来比较方便,毕竟是最先上手的UI,虽然有些地方还是有点欠缺。
UGUI也是网上的教程学的,但学的不多,只学了一些基础的只是,后面比较深入的东西还没学,就硬着头皮开始做项目了,不过项目里面涉及UI的部分不是特别多,而且我也只是做了一半。
当时的教程地址没有在收藏夹里找到,做项目的时候更多是拿官方案例,根据上面的已有的东西,自己学习一点。
个人学习:
1.canvas模式
overlay好处:摄像机前面不需要灯光,不需要摄像机,类似于NGUI,UI将永远显示在所有摄像机的最前面,但是如果要在UI前加特效是无法实现的,
适合做游戏的正式界面,(做场景游戏,各个关卡,ui只是显示数值,血量,魔法,宝石)
camera模式:必须使用摄像机,要绑定摄像机,和NGUI原理很像(雨松momo说的),想在UI前加特效可以创建一个摄像机深度大于这个UICamera就行。
移动摄像机,画布会随着移动,可以做UI的衬托(可以做一个很炫的UI)
该模式下的Plane Distance:建议100-200之间,值越大可以放置的东西越多
world space:完全3dUI,把UI当做3d对象
一般1、2用的最多
2.摄像机是不是主摄像机和它的名字没关系,和他的标签有关系
3.Canvas Scaler组件,关于画布的大小(一般使用第二个)
constant pixel size固定像素大小:
scale with screen size按照屏幕大小:
constant physical size固定物理大小:
屏幕自适应:
下面有match是匹配模式,screen match mode一般使用前两个,第一个是匹配宽高,第二个是扩展
4.所有的ui组件都会显示在canvas里面,canvas是所有控件的父对象
5.ugui下,若有多个canvas,里面有sorting layer排序层,就是canvas的层
6.panel控件(面板):可以将panel弄小一些放置其他控件,可以在panel上放置一些控件,该控件类似gameobject可以将上面的控件整体移动,
便于整个的管理控件,整体移动和整体处理,面板上可以添加颜色信息和图片信息,“容器”,功能完备的UI界面会有
panel多个控件
*7.EventSystem(事件处理器):作用:事件处理,独立输入模块,触控输入模块 这些处理都可以做整体的管理
8.UGUI核心控件:UGUI控件都是Rect Transform,Canvas Renderer每个控件都有的画布渲染,任何控件的中心都有锚点
(1)Text控件:字体文件扩展名ttf,可以在C:\Windows\Fonts下找,找到后可以直接拉到文件夹里,字体显示不开,要把整个文本控件范围拉大,
Rich Text:富文本,选中后将某个或某段文字嵌入
overflow(溢出): 选择overflow字体就会溢出范围,选择wrap截断
最好使用best fit
(2)Image图片控件:做成精灵(只是做2d的UI),可以直接将PSD文件拽入,u3d会将所有图片的压缩格式以另一种方式储存,不需创建图集,
会 自动创建图集
sprite贴图的一种形式,要将图片导入image控件,首先要将贴图的类型Textrue Type改成sprite
贴图转化后,它下拉菜单栏里新加的文件是用来u2d将图片分割用的
其中(EGUI和LGUI)Edit GUI and Legacy GUI是传统的GUI,4.6之前,选择这个选项,图片不会拉伸(类似准心就得用这个)
sprite比传统适用范围更窄,但是效率更高
shift键拉贴图同步放大缩小
material复杂的材质才用得到
*Image Type:
simple简单:展示贴图的原始风貌
sliced片(做背景比较好,用的比较多):图片要有边框,选择精灵然后精灵编辑sprite editor,做出9宫格(面片),使用这种类型边框会很细腻
边框不变(边框很平滑),做放大的只是内部,中间没有填充物的单一的放大(比NGUI好这边是可视界面操作)
tiled平铺(做背景):用一些小图片做背景比较好
filled填充(控制图片出现方式):做一些贴图特效,比如说将图片遮住一半或者按角度遮住,可以用脚本控制让图片渐渐显示出来
可以拿来做进度条或者时钟(填充bottom,填充方式360度)
Preserve Aspect(保存方面):长宽比等效,将空间里的图片,固定长宽比伸缩
set native size:将图片改为原始大小,美工定好了就可以选中
贴图参数:
(3)button控件:button控件包含image,还包含text控件
Image负责外观,
Button:
Interactivable(互动性,是否启用):类似于是否激活该按钮,可由脚本控制
Transition(过渡方式):
①color tint(色彩过渡,默认状态最常用):
normal正常显示的颜色
highlight经过的颜色
press点击的颜色
disable禁用的颜色
fade duration:变化快慢//可以做成渐变
②None:
③Sprite Swap(精灵交换,需要使用相同功能不同状态的贴图):
3个地方放置3个图片
④Animation(动画,最复杂,效果最绚丽):
点击生成Animation,点击该button然后windows下的animation调动画
在帧数上选择帧数1,对第一帧进行操作,红色是记录模式
animator controler动画状态机,左边红色的是录制按钮,动画做完后点击结束录制
给分别每个状态加动画
button事件:写UI脚本要加头注释:using UnityEngine.UI
OnClick做的是委托事件
锚点(屏幕自适应):可以拉伸unity界面的scene界面模拟屏幕改变
9.给image增加个Canvas Group组件,然后不勾选Blocks Raycasts选项,就可以穿透并点击到后面的按钮了
10.你可以在容器上加一个CanvasGroup组件,可以改整个子元素的透明度
直接改color,就是改它的Material的color,所以就改到那个共享的Sprites-Default 材质了
这边写的不多,也不是很完善,更多是要自己去学,去问,后面如果相关资源更多,学习起来也会更加方便,很多东西自己探索会更好一些。
三、UGUI和NGUI的区别
之前有说两者之间的差别,这边会进行一些对比,大部分从网上转载过来,我在个人学习里面也有讲一些。
(一)、(UGUI与NGUI优缺点对比)原帖:http://www.unitymanual.com/forum.php?mod=viewthread&tid=39435&page=0
如果要下载该图片,最好去原帖下载,尊重原创。
(二)、(UGUI与NGUI的区别与优缺点)原文:http://unity.gopedu.com/thread-9849-1-1.html
区别:
1、uGUI的Canvas 有世界坐标和屏幕坐标
2、uGUI的Image可以使用material
3、UGUI通过Mask来裁剪,而NGUI通过Panel的Clip
4、NGUI的渲染前后顺序是通过Widget的Depth,而UGUI渲染顺序根据Hierarchy的顺序,越下面渲染在顶层.
5、UGUI 不需要绑定Colliders,UI可以自动拦截事件
6、UGUI的Anchor是相对父对象,没有提供高级选项,个人感觉uGUI的Anchor操作起来比NGUI更方便
7、UGUI没有Atlas一说,使用Sprite Packer
8、UGUI的Navgation在Scene中能可视化
9、UGUI的事件需要实现事件系统的接口,但写起来也算简单
当然他们有各自的优缺点:
1、NGUI还保留着图集,需要进行图集的维护。而UGUI没有图集的概念,可以充分利用资源,避免重复资源。
2、UGUI出现了锚点的概念,更方便屏幕自适应。
3、NGUI支持图文混排,UGUI暂未发现支持此功能。
4、UGUI没有 UIWrap 来循环 scrollview 内容。
5、UGUI暂时没有Tween组件。
(三)、(Unity3D NGUI,uGUI总结)原文:http://m.blog.csdn.net/blog/u012141553/24236897
uGUI注意点:
1.要防止多个canvas叠加点击穿透,canvas里面的graphics raycaster调整到恰当选项
2.防止canvas在物体上层,点击canvas却穿透到物体上,触发物体的点击的事件,请参见下面示例代码
NGUI注意点:(超级影响性能的几点)
1.动画最好作用于panel而不是sprite
2.Sprite Type中的tile能不用就不用,卡死人
这篇文章差不多就写到这了,如果后续还有更多的学习还会有相应的更新,特别是以后公司里面使用NGUI,参与项目里面,应该会有更多的收获。