zoukankan      html  css  js  c++  java
  • NGUI(八)拖拽事件DragDropItem、背包案例

    DragDropItem:拖拽事件

    OnDragDropMove(Vector3 delta):拖拽移动时会调用

    OnDragDropStart(): 拖拽开始时调用

    OnDragDropRelease(GameObject surface): 拖拽结束时调用   surface: 放在哪个游戏物体上  该游戏物体需要有BoxCollider 不然检测不到就会提示Null

    背包案例

    1.创建背包界面 UIBagPanel

    2.创建背包背景BagBg, 添加BoxCollider和DragObject脚本使背包窗口可以拖动, 添加Grid组件,使背包的格子自动布局

    3.创建背包格子预制体CellItem,tag改为cell,添加BoxCollider为了方便拖拽事件检测

    4.创建物品预制体EquipItem, tag改为item, 添加BoxCollider和自写脚本DragItem, 继承自DragDropItem拖拽事件的脚本

    DragItem.cs

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class DragItem : UIDragDropItem      //继承UIDragDropItem 
    {
        public UISprite icon;       //图片
        public UILabel numText;     //数量文本
        private int count = 1;      //默认数量
    
        public void AddCount(int num=1)     //添加物品 增加数量
        {
            count += num;
            numText.text = count.ToString();
        }
    
        private void Start()
        {
            icon = GetComponent<UISprite>();
            numText = transform.GetComponentInChildren<UILabel>();
            numText.text = count.ToString();
        }
        protected override void OnDragDropRelease(GameObject surface)       //重写虚函数 拖拽放下 写我们需要的逻辑
        {
            base.OnDragDropRelease(surface);
            print("tag是:"+surface.tag);
            if(surface.tag == "cell")               //如果放下的物品是cell则放到格子内
            {
    
                transform.SetParent(surface.transform);
                transform.localPosition = Vector3.zero;
            }
            else if (surface.tag == "item")                 //如果检测到放到的物品的tag是item 则交换
            {
                Transform tmpParent = surface.transform.parent;
                surface.transform.parent = transform.parent;
                surface.transform.localPosition = Vector3.zero;
                transform.parent = tmpParent;
                transform.localPosition = Vector3.zero;
            }
        }
    }

    5.写背包界面的逻辑UIBagPanel.cs挂载再UIBagPanel上

    UIBagPanel.cs

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class UIBagPanel : MonoBehaviour
    {
        private Transform bagTrans;             //背包
        private GameObject cell;                //格子
        private List<GameObject> cells = new List<GameObject>(); //格子列表
        private GameObject equipItem;                           //装备Item
        private List<DragItem> equips = new List<DragItem>(); 
        private UIGrid grid;
        private string[] equipName = {"Orc Armor - Boots",
                                        "Orc Armor - Bracers",
                                        "Orc Armor - Shoulders"
                                        };                      //装备名数组
    
        private int widthMax;       //最大列数
        private int heightMax;      //最大行数
    
        private void Awake()
        {
            bagTrans = transform.Find("BagBg");                 //获取背包
            cell = transform.Find("CellItem").gameObject;       //获取格子
            equipItem = transform.Find("EquipItem").gameObject; //获取装备Item
            cell.SetActive(false);                              //隐藏格子
            equipItem.SetActive(false);                         //隐藏装备
            grid = bagTrans.GetComponent<UIGrid>();
        }
    
        private void Start()
        {
            widthMax = (int)(bagTrans.GetComponent<UISprite>().localSize.x / cell.GetComponent<UISprite>().localSize.x);      //根据背包宽度/格子宽度 获取最大列数
            heightMax = (int)(bagTrans.GetComponent<UISprite>().localSize.y / cell.GetComponent<UISprite>().localSize.y);     //根据背包高度/格子高度 获取最大行数
            Init();
        }
    
        public void Init()
        {
            for (int i = 0; i < widthMax * heightMax; i++)          //最大列数*最大行数 = 总格子数
            {
    
                GameObject go = Resources.Load<GameObject>("Prefabs/CellItem");     //加载格子预制体
                cell = Instantiate(go, bagTrans);                                   //克隆到背包下
                cell.name = "cell_" + i.ToString("D2");            // ToString("D2") 十进位数两位
                //cell.name = "cell";                                                 //改名为cell
                cells.Add(cell);                                                    //添加到格子列表中
                cells[i].SetActive(true);                                           //激活
            }
            grid.enabled = true;
        }
    
        private void Update()
        {
            if(Input.GetKeyDown(KeyCode.X))
            {
                PickUp();
            }
        }
        public void PickUp()
        {
            GameObject item = Resources.Load<GameObject>("Prefabs/equipItem");      //加载装备
            string name = equipName[Random.Range(0, equipName.Length)];             //随机获取一件装备
            bool isFind = false;            //是否找到
            
          
    
            for (int i = 0; i < cells.Count; i++)                                   //遍历格子总数
            {
                if (cells[i].transform.childCount>0)                               //判断该格子下方是否有子物体,如果有 则表示不为空,该格子有物品 反之则无 那么获取的物品放到该格子内
                {
                    //如果有 判断当前物体的名字
                    DragItem equipItem = cells[i].GetComponentInChildren<DragItem>();  //获取子物体的DragItem组件
                    //判断当前物品的名字跟捡到的物体名字是否一样
                    if (equipItem.icon.spriteName == name)
                    {
                        isFind = true;
                        equipItem.AddCount(1);
                        break;
                    }
                }
               
                
            }
            if(!isFind)
            {
                for (int i = 0; i < cells.Count; i++)                                   //遍历格子总数
                {
                    if(cells[i].transform.childCount == 0)
                    {
                        //添加物品
                        GameObject obj = NGUITools.AddChild(cells[i], item);            //NGUITool.AddChild(父物体,要放的物体) 往指定物体下面添加物体
                                                                                        //GameObject obj = Instantiate(go, cells[i].transform);
                        obj.GetComponent<UISprite>().spriteName = name;                 //换图片
                        obj.transform.localPosition = Vector3.zero;                     //位置归零
                        break;
                    }
                }
            }
    
        }
    
    }
  • 相关阅读:
    2017.11.2 JavaWeb----第六章 Servlet技术
    2017.11.1 微型计算机原理与接口技术-----第七章 中断系统与8237A DMA控制器
    2017.10.31 微型计算机组成原理与接口技术------- 第六章 存储器
    2017.10.30 软件工程------ 软件测试
    选择排序
    快速排序(基础版)
    [经验]java 高级面试解析
    [经验]java 高级面试
    链表翻转的图文讲解(递归与迭代两种实现)yet
    手把手教你如何自定义DAO框架(重量级干货)(yet)
  • 原文地址:https://www.cnblogs.com/yifengs/p/15519440.html
Copyright © 2011-2022 走看看