一、NGUI的公有属性
Widget面板属性:
Privot设置原点位置
Depth设置深度(跟UGUI一样,深度高的会挡住深度低的UI)
Snap恢复初始大小
Size设置大小
Aspect=宽度/高度,(Free模式下才可设置高度和宽度),其他两个模式固定宽度或者固定高度。
Anchors锚点与UGUI不同之处就是多了一个Advanced高级锚点,锚点相对位置可以针对不同的物体来设置,而不仅仅局限于父物体了。上图使用的Type是Unified普通模式。
Execute:OnEable启动时更新,OnUpdate每帧都更新
Target:指定物体设置的锚点挂载物体。UI Root是所有NGUI的父物体。
Left、Right、Bottom、Top设置左右下上的锚点。
设置锚点你要有个很清晰的思路:例如,我要把一个按钮固定放在窗口右下角,那么按钮的Left锚点和Right锚点都要设置到窗口右边去,后面的那个数值Unity会自动帮你算出一个距离,这个距离是绝对距离,那么当窗口左右宽度不断缩小或者放大,你那个设置了锚点的按钮宽度都不会变化,同样Bottom和Top都与窗口下边框保持一致距离,按钮高度也不会变化了。
注意:在设置好锚点后,一般我们都要亲自去测试是否真正完成了UI自适应,这一步不能漏。
二、Label组件
在UI Root创建一个Label方法:在Hierarchy面板选中UI Root,然后在Scene中右击Create -> Label
Unity->Font 表示Unity字体,源自系统字体.TTF
NGUI字体、动态字体如下:
出了那2个MyFont、MyFon1是动态字体(自定义字体),其余全是NGUI自带的字体。
NGUI字体演示:
动态字体集:NGUI-Open Font Maker,Type:Dynamic 点击Source选择你要设置为动态字体的字体资源,可设置大小和字体格式。
这里有个很坑的点,那就是选择字体格式Source,你点右边的那个小圈圈是没反应的,你要点Source去选。
然后Create the Font创建出来的是Prefab字体预制体。
三、Sprite
图集Atlas的设计方法:
NGUI-Open-Atlas Maker,New一个新的Atlas,然后选中你要设置成为图集的图片,点击Create,增删改图集的内容也是一样,删除直接选择要删除的Delete,增加和修改都要先选择你要增加的图片,然后点击Add/Update,如果你选中的图片名在图集中已存在,它会在图集中已存在的图片右方提示Update信息。
Sprite属性是图片名称。
Type:Simple、Sliced切片(九宫格切片技术,点Edit然后就可以切了)、Tiled(自动填充)、Filled(部分填充)、Advanced(高级模式:可切片也可自动填充)。
其中Tiled演示如下:
Filled可运用在技能CD的缓冲效果。
Gradient渐变颜色模式
Color Tint图片填充颜色
四、Panel
Alpha透明度,Depth深度
Clipping:Texture Mask贴图遮罩
Soft Clip只显示Panel范围内容
Constrain But Not Clip 不切除Panel范围内容
Advanced Options不介绍
五、Button
在Label或者Sprite的基础上,右击Attach->Box Collider和Attach->Button Sprite,就创建了一个Label-Button或Sprite-Button,在Sprite-Button下还可创建一个子Label充当Button内容。
监听事件与UGUI一样。
六、Slider(进度条)
创建一个Sprite,添加Box Collider和Slider Script成为Slider。
Value进度数值
Steps步长
Apperance:Foreground:填充图片(作为Slider物体的子物体存在,利用锚点填满父窗口)
Background:背景图片 (作为Slider物体的子物体存在,利用锚点填满父窗口)
Thumb:游标图片(一般不需要用,Foreground可代替游标图片)
Direction:填充方向
On Value Change:
Notify通知一般是通知一个Label,让它的内容变为进度数值。
Method:UILabel/SetCurrentPercent,这个方法的意思是设置UILabel的内容为当前进度数值。
七、PopupList(下拉列表)
创建方法:新创一个Sprite,添加Box Collider和Popup List Script,再添加一个子物体Label。
(注意:一定要有一个Label子物体去显示出下拉列表选择的内容!不然下拉列表形同虚设)
Options下拉列表子项显示内容,每行都代表一个子选项。
Position:显示方式:Auto自适应显示,Above向上显示列表,Below向下显示列表。
Alignment:列表内容对齐方式.
Open on:打开方式
Click Or Tap(鼠标左击、右击、中间键方式打开)
Right Click右击打开、Double Click双击打开
Manual手指触摸打开
Keep Value勾选上设置Initial Value默认选项内容
(Atlas可设置可不设置,看个人需求)
使用图集设置Background下拉列表背景图片,Highlight子选项高亮图片
(下面的On Value Change设置必填)
设置下拉列表内容的字体
On Value Change:Notify通知一般是一个Label(属于PopupList下的子物体)。
Method设置方法为UILabel/SetCurrentSelection,当选项内容改变时,将子物体Label的内容修改为选择的内容。
八、CheckBox(Toggle)复选框
创建方法:新建一个Sprite,添加Box Collider和Toggle Script,再添加一个子物体Sprite作为勾选显示的图片
在State Transition添加Sprite,其余的还可以添加Animator动作管理器、Animation动作、Tween动画,Transition属性设置移动模式。
九、InputField
创建方式:新建一个Sprite,添加Box Collider和Input Field Script,添加一个子物体Label作为文本作用区域。
Label:放入子物体Label文本作用区域
UI Label(Script)关键属性:
Overflow(溢出处理方式):
Shrink Content(缩放文本模式)
Clamp Content (固定文本模式) (其余2个不常用)
选择Clamp Content后,可设置 Use Ellipsis 使用省略。
UI Input(Script)属性:
Input Type 输入模式:Password显示内容变为'*'
Validation:验证模式:整数、浮点型、Alphanumeric(字母数字)、Username(用户名)、Name(英文名)、Filename(文件名).
Mobile Keyboard设置移动键盘模式。
Hide Input 隐藏输入
On Return Key的Submit模式和New Line模式分别是按下回车发出Submit消息和按下回合换行。
Character Limit 字数限制
On Submit中设置发生Submit消息后将要发生的事件。
On Change中设置发生Label内容改变后将要发生的事件。
十、Text List和Scroll Bar
1.Text List:
创建方式:新建一个Label,添加Box Collider和直接Add一个Text List脚本,若你想文本列表有背景图片,要新建一个Sprite作为背景图片,把这个Text List放在背景图片下面作为子物体存在(锚点自适应填充满父物体)。
Text Label:文本Label。
Scroll Bar:关联滚动条。
Style:Text文本模式(从左上角开始显示文本),Chat聊天模式(从左下角开始显示文本)
Paragraph History:历史记录上限,当信息总数超过这个上限会将最旧的消息删除,来使得信息总数少于记录上限额度。
如何给TextList添加文本,以及其他添加文本等问题都是脚本对象.Add() 这样添加。
2.Scroll Bar:
创建方式:新建一个Sprite,添加Box Collider和Scroll Bar Script,添加一个子物体Sprite作为游标。
设置如下图所示:
(有没有似曾相似的感觉,没错!它和Slider几乎一模一样,多了Size游标大小,Alpha透明度而已!)
游标Size其实不用设置的!因为其他UI关联滚动条,滚动条才有意义,一旦有了关联关系,游标的大小会根据对方的内容而变化大小,例如:当文本列表内容很少的时候,游标占据滚动条的比例是很大的,当文本列表内容很多的时候,游标占据滚动条的比例就变小了。
十一、Tween相关动画脚本(NGUI自带)
Tween Xxxx形式的都是Tween动画脚本,例如:Tween Rotation控制旋转动画...
每种Tween动画脚本都有这些属性:
From 就是动画控制物体的初始状态,To 就是 动画控制物体的终止状态。(上图是控制旋转的)
Tweener中设置的是动画属性>Play Style:Loop“开始->结束模式循环”、Ping Pong“狗咬尾循环”。
Tween Group动画组,NGUI对动画进行编组。
Ignore TimeScale 忽视TimeScale影响
十二、拖拽功能和调整大小功能
UI Drag Object给物体增加可拖拽功能脚本。Target设置可拖拽的物体。(一般是个Sprite背景图)
可拖拽的箭头设置好自适应,这个可拖拽的箭头适应父物体的右下角。
这个箭头物体是ChatWindow的子物体ButtonResize(名字随意起的).
十三、UI血条跟踪角色功能
UI Follow Target脚本实现UI跟踪游戏物体功能。(UI需要带这个脚本,被跟踪的物体不需要带)
Target:跟踪的物体Transform
Game Camera:游戏摄像机物体
UI Camera:UI摄像机物体
*Disable If Invisible:表示当Target物体不可见时,禁用掉带有UI Follow Target脚本的物体的子物体。
(注意:为了优化性能,我们需要把带有Follow Target脚本的物体B在不可见的情况下,能禁用掉。所以,我们要在把这个物体B放在一个空物体A下,空物体A带上Follow Target脚本并且勾选上Disable If Invisible,物体B只是一个普通的UI,这样我们就优化了。)
十四、伤害值或治愈值动态跟踪显示功能
HUD Text脚本:
主要介绍3个动画曲线:
Offset Curve 位移曲线
Alpha Curve 透明度曲线
演示图:(这里面也是用到了UI Follow Target脚本的,是为了将这个带有HUD Text脚本物体跟踪到角色的头上)
(红色代表扣血,绿色代表加血)
我们可以在这个基础上,再结合上面介绍的UI Follow Target脚本,让伤害值能够显示在对应的位置上面,并且你也可以将其他的一些例如:血条、名称、称号等等一系列东西弄上去。
(为了再次强调我在[十三]说的优化性能,我再说一次,Disable If Invisible是设置当Target物体不可见时,血条、伤害值、名称、称号这些UI都会被禁用掉,从而优化性能,注意:禁用的是带有UI Follow Target脚本的(物体X)身下的子物体!!那么我们可以把这些需要去跟踪角色的UI成为物体X的子物体,然后设置好相对位置,当角色不可见时候,这些UI也会被禁用了。)
例子:
HudGo带有UI Follow Target脚本的空物体,旗下有3个UI,Hud显示数值的,其他2个分别是血条和名称
在Editor模式下的Scene如图:
运行后:(左击是减血,右击是加血,血条没有增加和减少是因为我没弄响应事件,在这里主要是简单实验一下)
十五、背包系统的拖拽道具功能
新建一个Sprite+Box Collider+自定义脚本(Knapsack Drag Drop Item)成为一个可拖拽的道具。
Knapsack Drag Drop Item脚本如下:
using System.Collections; using System.Collections.Generic; using UnityEngine; public class KnapsackDragDropItem : UIDragDropItem { //保存道具的UISprite脚本 public UISprite sprite; //道具数量文本 public UILabel label; //道具数量 private int count = 1; /// <summary> /// surface是检测到boxcollider的,没有boxcollider的物体检测不到 /// 注意:Depth影响到检测,一般道具都是在Cell上方的,所以如果Cell里面有道具,说明检测到的是Item /// </summary> /// <param name="surface"></param> protected override void OnDragDropRelease(GameObject surface) { base.OnDragDropRelease(surface); //Cell为背包标签,Item为道具标签(任何道具都是Item标签) //一定要确保真的是Cell下没有物体才能直接移动过去,不然会出现重叠道具现象 if(surface.tag=="Cell"&&surface.transform.childCount==0) { this.transform.parent = surface.transform; //添加到移动到的格子下,然后设置局部坐标为(0,0,0)居中 this.transform.localPosition = Vector3.zero; } else if(surface.tag=="Item") { //将要移动到的背包格子带的道具的父物体赋值给parent保存 Transform parent = surface.transform.parent; //将要移动到的格子身上的道具surface设置它的父物体为正在移动的道具身上的父物体 surface.transform.parent = this.transform.parent; //设置局部坐标为(0,0,0)居中显示 surface.transform.localPosition = Vector3.zero; //设置正在移动的道具的父物体为目标格子 this.transform.parent = parent; this.transform.localPosition = Vector3.zero;//居中 } } /// <summary> /// 增加道具数量 /// </summary> /// <param name="number"></param> public void AddCount(int number=1) { count += number; label.text = count + ""; } }
using System.Collections; using System.Collections.Generic; using UnityEngine; public class knapsackController : MonoBehaviour { public GameObject item; //道具预制体(捡起物体就要生成这个预制体) public string[] equipmentsName;//保存装备名字(其实是Sprite名字)千万不要打错装备名,因找不到装备而出错! public GameObject[] cells; //保存所有的背包格子 private void Update() { //按X按键会捡起物体 if(Input.GetKeyDown(KeyCode.X)) { PickUp(); } } /// <summary> /// 捡起物品 思路:随机出一个装备名,在空背包中生成一个item预制体,修改这个预制体的Sprite=装备名, /// 然后居中显示,若背包中已经有相同装备名的物体,则将那个道具的数量加1,而不会添加新的道具上去。 /// 这种模式是模拟捡道具,真实情况下,道具的叠加是根据用户的操作而决定的。 /// </summary> public void PickUp() { int index = Random.Range(0, equipmentsName.Length); //随机捡起 string name = equipmentsName[index]; bool isFind = false; for(int i=0;i<cells.Length;i++) { //判断当前格子有没有物品,判断cells[i]下的游戏物品的Sprite名字 if(cells[i].transform.childCount>0) { //获取当前格子下的道具的特有脚本KnapsackDragDropItem KnapsackDragDropItem item = cells[i].GetComponentInChildren<KnapsackDragDropItem>(); //若item不为空,证明该背包格子下有道具。 if (item != null) { //这个脚本保存了道具的UISprite脚本以及道具的Label子物体脚本 //判断当前游戏物体的Sprite名与捡起物品Sprite名字是否一样 if (item.sprite.spriteName == name) { //找到了有相同名字的道具 isFind = true; //只修改道具数量 item.AddCount(1); break; } } } } //如果添加入的道具,在背包中没有找到相同的,则在背包中找到空Cell添加这个道具 if (isFind == false) { //根据名字实例化出来物品,放在Cell下面 for (int i = 0; i < cells.Length; i++) { //说明这个格子没有物品 if (cells[i].transform.childCount == 0) { //添加捡起来的物品进入cell[i]下面 GameObject go = NGUITools.AddChild(cells[i], item);//注意这个:item是公有成员GameObject //更新道具的Sprite,因为这个go是空壳子 go.GetComponent<UISprite>().spriteName = name; //重设位置 go.transform.localPosition = Vector3.zero;//居中 break; } } } //TODO 如果背包满了的处理,等等都要考虑,这里我只作一个简单的例子说明 } }