Kéo thả Vật phẩm trong Kho đồ (Drag & Drop)
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.