Unity3D 游戏开发:制作游戏背包 实现物品拖拽效果(29)

381 阅读1分钟

一、开发操作

1、创建新的Canvas,重命名为Drag Canvas,调整好参数

image.png

2、为Drags添加Image子物体,重命名为,调整好参数

image.png

3、注意取消勾选Raycast Target,防止图片屏蔽鼠射线

image.png

二、脚本编程

using UnityEngine;
using UnityEngine.UI;
using TMPro;
using UnityEngine.EventSystems;

namespace MFarm.Inventory
{
    public class SlotUI : MonoBehaviour,IPointerClickHandler,IBeginDragHandler,IDragHandler,IEndDragHandler 
    {
        [Header("组件的获取")]
        [SerializeField] private Image slotImage;

        [SerializeField] private TextMeshProUGUI amountText;

        public  Image slotHightlight;

        [SerializeField] private Button button;

        [Header("格子类型")]
        public SlotType slotType;

        public bool isSelected;

        public int slotIndex;
        //物品信息
        public ItemDetails itemDetails;

        public int itemAmount; 

        private InventoryUI inventoryUI=>GetComponentInParent<InventoryUI>();

        private void Start()
        {
            isSelected = false;

            if (itemDetails.itemID == 0)
            {
                UpdateEmptySlot();
            }
        }

        //更新格子UI和信息
        public void UpdateSlot(ItemDetails item, int amount)
        {
            itemDetails = item;
            slotImage.sprite = item.itemIcon;
            itemAmount = amount;
            amountText.text = amount.ToString();
            slotImage.enabled = true;
            button.interactable = true;
        }

        //将Slot更新为空
        public void UpdateEmptySlot()
        {
            if (isSelected)
            {
                isSelected = false;
            }
            slotImage.enabled = false;
            amountText.text = string.Empty;
            button.interactable = false;
        }

        public void OnPointerClick(PointerEventData eventData)
        {
            if (itemAmount == 0) return;
            isSelected=!isSelected;
           
            inventoryUI.UpdateSlotHightlight ( slotIndex );


        }

        public void OnBeginDrag(PointerEventData eventData)
        {
            if (itemAmount != 0)
            { 
                inventoryUI.dragItem.enabled = true;
                inventoryUI.dragItem.sprite = slotImage.sprite;
                inventoryUI.dragItem.SetNativeSize();

                isSelected = true;
                inventoryUI.UpdateSlotHightlight(slotIndex);
            }
        }

        public void OnDrag(PointerEventData eventData)
        {
            inventoryUI.dragItem.transform.position=Input.mousePosition;
        }

        public void OnEndDrag(PointerEventData eventData)
        {
            inventoryUI.dragItem.enabled = false;
            Debug.Log(eventData.pointerCurrentRaycast.gameObject);
        }
    }
}


三、脚本逻辑

未完待续......

阅读更多作者文章:

Unity3D 游戏开发:制作游戏背包 背包物品选择时高亮显示和动画(28)