ngui

Unity之NGUI插件(二)

2018-01-17  本文已影响101人  Joe_Game

Scrow View

这样一个可以滚动的滚动窗口就做好了


背包

调整屏幕自适应

注意:
1. 这里的Content Width、Content Height跟屏幕分辨率的宽高对应
2. 如果是横屏显示则根据高度变化自适应宽度,需要把Content Height后面的Fit勾选上;如果是竖屏显示则根据宽度变化自适应高度,需要把Content Width后面的Fit勾选上

创建背包

设置Tag

创建BagItem脚本

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class BagItem : UIDragDropItem {
    [HideInInspector]
    public UISprite SprItem;//游戏物品的贴图
    [HideInInspector]
    public UILabel LabItem;//游戏物品的数量

    private int count = 1;
    private int newDepth;
    private int oldDepth;


    public  void AddCount(int num)
    {
        count += num;
        LabItem.text = count.ToString();
    }

    protected override void OnDragStart()
    {
        //实现父类中原有的功能
        base.OnDragStart();
        //将游戏物品的深度调大,使它显示在页面的最上方
        SprItem.depth = newDepth;
        LabItem.depth = newDepth + 1;
    }

    protected override void OnDragEnd()
    {
        base.OnDragEnd();

        SprItem.depth = oldDepth;
        LabItem.depth = oldDepth + 1;
    }
    /// <summary>
    /// 重写的拖拽方法
    /// </summary>
    /// <param name="surface">释放时,游戏对象接触的表明,这里就是背包格子</param>
    protected override void OnDragDropRelease(GameObject surface)
    {
        base.OnDragDropRelease(surface);

        if (surface.CompareTag("Cell"))
        {//底下是一个单元格,而且单元格是空的,直接绑定父物体
            //指定父物体
            transform.parent = surface.transform;
            //对齐父物体的位置
            transform.localPosition = Vector3.zero;
        }
        else if (surface.CompareTag("Item"))
        {//底下是一个游戏物品,也就是拖到的单元格中有游戏物品,交换位置,交换父物体
            //记录单元格的Transform,接触到的游戏物品的父物体
            Transform trP = surface.transform.parent;
            //设置接触到的游戏物品的父物体设置为当前拖动游戏物品的父物体
            surface.transform.parent = transform.parent;
            surface.transform.localPosition = Vector3.zero;
            //当前拖动的游戏物体的父物体设置为trp
            transform.parent = trP;
            transform.localPosition = Vector3.zero;
        }
        else
        {
            print("删除?");
        }
    }
    //注意这里有个new!!!!
    //注意LabelItem在子物体中得到组件
    new void Start()
    {
        SprItem = GetComponent<UISprite>();
        LabItem = GetComponentInChildren<UILabel>();
        newDepth = 10;
        oldDepth = SprItem.depth;
    }

}


创建Bag脚本

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Bag : MonoBehaviour {

    public GameObject[] Cells;//所有格子
    public string[] EquipentNames;//所有装备名字
    public GameObject Item;//游戏物品的预设体
    

    void Update () {
        if (Input.GetKeyDown(KeyCode.A))
        {
            PickUp();
        }
    }

    void PickUp()
    {
        int index = Random.Range(0,EquipentNames.Length);
        string name = EquipentNames[index];
        //默认背包中没有该游戏物品
        bool IsFind = false;

        //遍历单元格,查找背包中有没有
        for (int i = 0; i < Cells.Length; i++)
        {
            if (Cells[i].transform.childCount>0)
            {
                //表示背包格子有子物体
                //BagItem item = Cells[i].transform.GetChild(0).GetComponent<BagItem>();
                BagItem item = Cells[i].GetComponentInChildren<BagItem>();
                //以上两种写法都可以
                //判断子物体的精灵名称是否跟随机出来的游戏物品名称一致,
                if (item.SprItem.spriteName.Equals(name))
                {//如果一致,那么证明背包中有此物品,游戏物品数量+1
                    item.AddCount(1);
                    IsFind = true;
                    break;
                }
                
                
            }
        }

        //如果都不一致,就没有该游戏物品,克隆
        //假如没有该游戏物品
        if (!IsFind)
        {
            //找到没有游戏物品的格子
            for (int i = 0; i < Cells.Length; i++)
            {
                //如果格子是空的
                if (Cells[i].transform.childCount==0)
                {
                    //使游戏物品成为此背包格的子物体
                    GameObject g = NGUITools.AddChild(Cells[i],Item);
                    //给游戏物品替换相应的贴图
                    g.GetComponent<UISprite>().spriteName = name;
                    //调整位置
                    g.transform.localPosition = Vector3.zero;
                    //return:
                    //这里用return,用来跳出本次循环,进入下次循环
                    //也就是说当前格子判断完还要判断下个格子
                    //当所有格子遍历判断是否有子物体完毕后,才会离开循环,打印“背包已满”
                    //break:
                    //注意:在这里不要使用break,break是跳出本层循环,
                    //也就是说,如果当前格子里没有游戏物品的时候,break会跳出本层循环,去打印“背包已满”
                    //显然不合理,还没有遍历所有的格子是否都有子物体,就打印出了“背包已满”
                    return;
                }
                

            }
            print("背包已满");

        }
    }
}

到这里,已经实现了背包的拖拽、背包存放物品、背包中物品的交换


按钮触发事件

刚刚搭建好了背包的UI,以及一些功能,现在需要实现按钮的触发事件
实现按钮触发事件有两种方式:
通过NGUI控件的事件脚本和NGUI动画实现
通过自己写一个触发事件的脚本和NGUI动画实现

1.通过NGUI控件的事件脚本和NGUI动画实现

2.通过自己写一个触发事件的脚本和NGUI动画实现

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class BtnEvent : MonoBehaviour
{

    public UIButton BtnOpen;
    public UIButton BtnClose;
    public UISprite BG;
    private TweenPosition tp;

    private void Awake()
    {
        tp = GetComponent<TweenPosition>();
    }

    private void OnEnable()
    {
        BtnOpen.onClick.Add(new EventDelegate(ClickBtnOpen));
        BtnClose.onClick.Add(new EventDelegate(ClickBtnClose));
    }

    private void OnDisable()
    {
        BtnOpen.onClick.Remove(new EventDelegate(ClickBtnOpen));
        BtnClose.onClick.Remove(new EventDelegate(ClickBtnClose));
    }

    void ClickBtnOpen()
    {
        tp.PlayForward();
    }

    void ClickBtnClose()
    {
        tp.PlayReverse();
    }
}

最终样式


到这里,所有的功能都实现了
按A可以随机添加物品;
可以增加物品数量;
可以交换物品位置;
鼠标按住Sprite-Head可以进行拖拽
按Button-Bag按钮可以显示背包
按Button-Close按钮可以隐藏背包


最后:NGUI的学习内容就到这里了,各位再见,加油!!!
上一篇下一篇

猜你喜欢

热点阅读