NGUI插件的使用

一、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背景图) 

    

设置可拖拽的箭头,Sprite+box collider+drag resize script,设置Drag Resize中的Target设置为窗体物体。(这样拖动箭头可缩放Target物体的大小)(drag resize意思是拖动调整[大小])
可拖拽的箭头设置好自适应,这个可拖拽的箭头适应父物体的右下角。
这个箭头物体是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 透明度曲线
         Scale Curve 大小曲线

    使用方法:创建一个空物体,Add一个HUD Text脚本,然后在另外一个脚本中,通过获取该物体身上的HUD Text脚本,调用hud.Add(数值,Color,逗留时长),然后这样就会在那个空物体的位置显示出类似于“伤害值”这样的数值,并且带有3个动画:位移动画、大小动画、透明度动画。

    演示图:(这里面也是用到了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 如果背包满了的处理,等等都要考虑,这里我只作一个简单的例子说明
    }
}



猜你喜欢

转载自blog.csdn.net/qq_39574690/article/details/79703167