Unity实现简单的背包

搭建UI

运行后

 

可以随意地进行拖拽,变化物品的位置

具体实现:

商店(左图)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;

public class Shop : MonoBehaviour
{
    public GameObject btnPrefab;//商城物体预设体
    public Transform packageTF;//背包父物体
    //public Transform shopTF;//商城物品父物体
    public GameObject itemPrefab;//背包物品的预设体

    public static Shop Instance;

    private void Awake()
    {
        Instance = this;
    }

    void Start()
    {
        Singleton s = Singleton.Instance;
        Singleton s1 = Singleton.Instance;

        for (int i = 0; i < 26; i++)
        {
            Sprite sp = Resources.Load<Sprite>(i.ToString());//加载资源
                                                    //创建商城物品
            GameObject btn = Instantiate<GameObject>(btnPrefab);
            btn.transform.SetParent(transform, false);
            btn.GetComponent<Image>().sprite = sp;
            int temp = i;
            btn.GetComponent<Button>().onClick.AddListener(() => {
                btnClick(sp);
                //btnClick1(temp);
            });
        }
    }

    void btnClick1(int index){
        Debug.Log(index);
       // SceneManager.LoadScene(index);
    }


    void btnClick(Sprite sp){
        //遍历背包上面所有的子物体 -- cell
        for (int i = 0; i < packageTF.childCount; i++)
        {
            //拿到每个cell
            Transform cell = packageTF.GetChild(i);
            //判断cell上是否有子物体
            if (cell.childCount > 0)
            {
                //说明现在cell上有子物体
                //判断该cell上的物品跟所选物品是否重复
                if (cell.GetChild(0).GetComponent<Image>().sprite.name == sp.name)
                {
                    //说明所选物品重复
                    Text numberText = cell.GetChild(0).GetComponentInChildren<Text>();
                    if (numberText.text == string.Empty)
                    {
                        numberText.text = "1";
                    }
                    int count = int.Parse(numberText.text);
                    count++;
                    numberText.text = count.ToString();
                    return;
                }
            }
        }
        //如果代码能达到此地 说明--所选物品没有购买过
        //在空格子处生成新物品
        for (int i = 0; i < packageTF.childCount; i++)
        {
            //拿到每个cell
            Transform cell = packageTF.GetChild(i);
            if (cell.childCount == 0)
            {
                //创建游戏道具 到当前的cell上
                GameObject item = Instantiate<GameObject>(itemPrefab);
                item.transform.SetParent(cell.transform, false);
                item.transform.localPosition = Vector2.zero;
                item.GetComponent<Image>().sprite = sp;
                //把text打开
                item.transform.GetChild(0).gameObject.SetActive(true);
                return;
            }
        }
    }

    
}

 预设体:

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

public class Package : MonoBehaviour,IBeginDragHandler,IDragHandler,IEndDragHandler
{
    //拖拽物品时的物体
    Transform dragParent;
    //开始拖拽前的父物体
    Transform originalParent;

    private void Start()
    {
        dragParent = transform.root;
    }

    public void OnBeginDrag(PointerEventData eventData)
    {
        originalParent = transform.parent;//记录开始前父物体
        transform.SetParent(dragParent,true);//设置拖拽中的父物体
        transform.GetComponent<CanvasGroup>().blocksRaycasts = false;
    }

    public void OnDrag(PointerEventData eventData)
    {
        //鼠标拖拽时 鼠标的位置=item的位置
        transform.position = eventData.position;
    }

    public void OnEndDrag(PointerEventData eventData)
    {
        if (eventData.pointerEnter == null || eventData.pointerEnter.name == "Panel" ||  eventData.pointerEnter.name == "package")
        {
            //拖拽结束 回到原位置
            transform.SetParent(originalParent);
            transform.localPosition = Vector2.zero;
            transform.GetComponent<CanvasGroup>().blocksRaycasts = true;
            return;
        }

        switch (eventData.pointerEnter.tag)
        {
            case "Cell":
                transform.SetParent(eventData.pointerEnter.transform);
                transform.localPosition = Vector2.zero;
                break;
            case "Item":
                Transform currentItemParent = eventData.pointerEnter.transform.parent;
                eventData.pointerEnter.transform.SetParent(originalParent);
                transform.SetParent(currentItemParent);
                transform.localPosition = Vector2.zero;
                eventData.pointerEnter.transform.localPosition = Vector2.zero;
                break;
            default:
                break;
        }
        transform.GetComponent<CanvasGroup>().blocksRaycasts = true;
    }

}

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值