Kéo thả Vật phẩm trong Kho đồ (Drag & Drop)

Tags:
UI
Inventory
Drag and Drop
Input

C# Code

using UnityEngine;
using UnityEngine.EventSystems;

// Gắn script này vào Prefab của mỗi Item trong UI
[RequireComponent(typeof(CanvasGroup))]
public class DragDropItem : MonoBehaviour, IBeginDragHandler, IEndDragHandler, IDragHandler
{
    private RectTransform rectTransform;
    private CanvasGroup canvasGroup;
    private Vector2 startPosition;
    private Transform originalParent;

    void Awake()
    {
        rectTransform = GetComponent<RectTransform>();
        canvasGroup = GetComponent<CanvasGroup>();
    }

    public void OnBeginDrag(PointerEventData eventData)
    {
        Debug.Log("Begin Drag");
        startPosition = rectTransform.anchoredPosition;
        originalParent = transform.parent;
        transform.SetParent(transform.root); // Kéo ra khỏi slot để hiển thị trên cùng
        canvasGroup.blocksRaycasts = false; // Cho phép raycast đi xuyên qua item đang kéo
    }

    public void OnDrag(PointerEventData eventData)
    {
        rectTransform.anchoredPosition += eventData.delta / canvasGroup.transform.lossyScale.x;
    }

    public void OnEndDrag(PointerEventData eventData)
    {
        Debug.Log("End Drag");
        canvasGroup.blocksRaycasts = true;

        // Nếu không thả vào slot hợp lệ, quay về vị trí cũ
        if (transform.parent == transform.root) // Vẫn là con của Canvas root
        {
            transform.SetParent(originalParent);
            rectTransform.anchoredPosition = startPosition;
        }
    }
}

// Gắn script này vào Prefab của mỗi Slot trong UI
public class InventorySlotDrop : MonoBehaviour, IDropHandler
{
    public void OnDrop(PointerEventData eventData)
    {
        Debug.Log("OnDrop to slot");
        if (eventData.pointerDrag != null)
        {
            // Đặt item được kéo làm con của slot này
            eventData.pointerDrag.transform.SetParent(this.transform);
            eventData.pointerDrag.GetComponent<RectTransform>().anchoredPosition = Vector2.zero;
        }
    }
}

Một hệ thống UI cho phép người chơi kéo thả vật phẩm giữa các ô trong kho đồ. Yêu cầu một CanvasGroup trên prefab của item để xử lý raycast.

Bình luận (0)

Bạn cần đăng nhập để có thể bình luận.

Chưa có bình luận nào. Hãy là người đầu tiên!

Bài viết liên quan

Một hệ thống kho đồ cơ bản sử dụng ScriptableObject cho dữ liệu vật phẩm và quản lý các ô chứa trong UI.

UI
Gameplay
Inventory
ScriptableObject
Architecture

Hiển thị một khung thông tin (tooltip) khi người dùng di chuột qua một đối tượng UI. Gồm 3 scripts: TooltipTrigger để kích hoạt, Tooltip để hiển thị, và TooltipManager (Singleton) để quản lý.

UI
Tooltip
Input

Tạo một joystick ảo có thể di chuyển bằng cách kéo thả trên màn hình cảm ứng. Yêu cầu 2 đối tượng Image UI cho background và handle của joystick.

Mobile
UI
Input
Player
Movement

Cho phép người chơi di chuyển nhân vật đến một vị trí trên mặt đất bằng cách chạm vào điểm đó trên màn hình. Sử dụng Raycast để xác định vị trí trong không gian 3D.

Mobile
3D
Movement
Player
Input

Cung cấp chức năng cho người chơi chụp lại khoảnh khắc trong game và lưu thành tệp PNG vào một thư mục được chỉ định.

Utility
Input
Mobile
Saving

Một script để quản lý một điểm đánh dấu trên UI (ví dụ: icon nhiệm vụ), đảm bảo nó luôn chỉ đúng hướng tới mục tiêu trong không gian 3D và ghim vào cạnh màn hình khi mục tiêu ở ngoài tầm nhìn.

UI
Navigation
Quest
Camera

Sử dụng Input System mới của Unity để di chuyển nhân vật 2D hoặc 3D một cách hiệu quả và linh hoạt.

2D
3D
Input
Gameplay
Player

Sử dụng cảm biến con quay hồi chuyển (gyroscope) của điện thoại để điều khiển sự xoay của một đối tượng. Hữu ích cho các game đua xe hoặc trải nghiệm VR/AR đơn giản.

Mobile
Input
Movement
Rotation
Sensor

Sử dụng Rich Text tags để thay đổi màu sắc của một phần văn bản trong TextMeshPro một cách linh hoạt mà không cần thay đổi màu của toàn bộ đối tượng.

UI
TextMeshPro
Rich Text

Sử dụng DOPunchScale của DOTween để tạo hiệu ứng 'nảy' hoặc 'đấm' cho đối tượng, rất hữu ích cho các nút bấm hoặc item.

DOTween
Animation
Punch
UI