본문 바로가기
개발/C#

유니티 C# 인벤토리 드래그 앤 드롭 시스템 간단 구현 Inventory Drag and Drop

by SPNK 2024. 2. 14.
반응형
  • 코드 작성
using UnityEngine;
using UnityEngine.UI;

public class InventoryItem : MonoBehaviour
{
    public string itemName;
    public Sprite itemIcon;
}

public class InventorySlot : MonoBehaviour
{
    public int slotIndex;
    public InventoryItem currentItem;
}

public class InventoryDragAndDrop : MonoBehaviour
{
    private InventoryItem draggedItem;
    private Image draggedItemImage;
    private Transform originalParent;

    // 드래그 중인 아이템의 초기 위치
    private Vector3 originalPosition;

    void Start()
    {
        draggedItemImage = Instantiate(Resources.Load<Image>("DraggedItemImage"));
        draggedItemImage.gameObject.SetActive(false);
    }

    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            // 아이템을 클릭하여 드래그를 시작합니다.
            TryStartDrag();
        }

        if (Input.GetMouseButtonUp(0))
        {
            // 마우스 버튼이 놓여지면 드래그를 종료합니다.
            EndDrag();
        }

        // 드래그 중일 때, 드래그된 아이템을 마우스 위치로 이동시킵니다.
        if (draggedItem != null)
        {
            UpdateDraggedItemPosition();
        }
    }

    void TryStartDrag()
    {
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        RaycastHit hit;

        if (Physics.Raycast(ray, out hit))
        {
            // 클릭된 오브젝트가 InventoryItem을 가지고 있다면 드래그를 시작합니다.
            InventoryItem inventoryItem = hit.collider.GetComponent<InventoryItem>();
            if (inventoryItem != null)
            {
                StartDrag(inventoryItem);
            }
        }
    }

    void StartDrag(InventoryItem item)
    {
        draggedItem = item;
        originalParent = item.transform.parent;
        originalPosition = item.transform.position;

        // 드래그 중인 아이템의 이미지를 활성화하고 위치를 설정합니다.
        draggedItemImage.sprite = item.itemIcon;
        draggedItemImage.gameObject.SetActive(true);
        draggedItemImage.transform.position = Input.mousePosition;

        // 원래의 InventorySlot에서 아이템을 제거합니다.
        item.transform.SetParent(transform);
        item.transform.position = Input.mousePosition;
    }

    void EndDrag()
    {
        if (draggedItem != null)
        {
            // 드래그가 끝나면 아이템을 적절한 슬롯으로 이동시킵니다.
            TryDropItem();
            ResetDraggedItem();
        }
    }

    void TryDropItem()
    {
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        RaycastHit hit;

        if (Physics.Raycast(ray, out hit))
        {
            // 놓인 위치에 InventorySlot이 있다면 해당 슬롯으로 아이템을 이동시킵니다.
            InventorySlot inventorySlot = hit.collider.GetComponent<InventorySlot>();
            if (inventorySlot != null)
            {
                MoveItemToSlot(inventorySlot);
            }
        }
    }

    void MoveItemToSlot(InventorySlot slot)
    {
        // 아이템을 새로운 슬롯으로 이동시킵니다.
        slot.currentItem = draggedItem;
        draggedItem.transform.SetParent(slot.transform);
        draggedItem.transform.position = slot.transform.position;
    }

    void ResetDraggedItem()
    {
        // 드래그된 아이템과 이미지를 초기 상태로 리셋합니다.
        draggedItem.transform.SetParent(originalParent);
        draggedItem.transform.position = originalPosition;
        draggedItem = null;

        draggedItemImage.gameObject.SetActive(false);
    }

    void UpdateDraggedItemPosition()
    {
        // 드래그된 아이템 이미지를 마우스 위치로 이동시킵니다.
        draggedItemImage.transform.position = Input.mousePosition;
    }
}
반응형

댓글