2026-03-26 인벤토리

This commit is contained in:
2026-03-26 18:05:30 +09:00
parent faf692673d
commit 54402ae1eb
71 changed files with 3668 additions and 350 deletions

View File

@@ -0,0 +1,84 @@
using UnityEngine;
using UnityEngine.EventSystems;
public class InventoryItemControl : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler
{
[HideInInspector] public InventorySlot ParentSlot;
private Transform _dragTransform;
private CanvasGroup _canvasGroup;
private void Awake()
{
_canvasGroup = GetComponent<CanvasGroup>();
}
private void Start()
{
_dragTransform = GameManager.Instance.InGameUI.DragCanvas;
}
public void OnBeginDrag(PointerEventData eventData)
{
// 시작할 때 부모 슬롯을 아예 스크립트 통째로 저장!
ParentSlot = GetComponentInParent<InventorySlot>();
if (ParentSlot == null || ParentSlot.currentItem == null)
{
// eventData.pointerDrag를 null로 만들면 이후 OnDrag, OnEndDrag도 호출안됨
eventData.pointerDrag = null;
return;
}
transform.SetParent(_dragTransform);
_canvasGroup.blocksRaycasts = false;
}
public void OnDrag(PointerEventData eventData)
{
transform.position = eventData.position; // 마우스 위치 추적
}
public void OnEndDrag(PointerEventData eventData)
{
_canvasGroup.blocksRaycasts = true;
// 마우스 아래에 슬롯이 없어서 제자리로 복귀해야 하는 상황인지 판별
if (transform.parent == _dragTransform)
{
// eventData.pointerEnter는 드래그가 끝난 지점에 마우스가 가리키고 있는 오브젝트 (이전까지 _canvasGroup.blocksRaycasts = false; 였으므로 자신 제외)
// 가르키는 오브젝트가 없거나, UI 레이어가 아니라면 버린것으로 간주
bool isDroppedOutsideUI = eventData.pointerEnter == null || eventData.pointerEnter.layer != LayerMask.NameToLayer("UI");
if (isDroppedOutsideUI)
{
// 먼저 원래 부모 슬롯으로 복귀시킴 (드래그 전용 캔버스에 남는것을 방지)
transform.SetParent(ParentSlot.transform);
transform.localPosition = Vector3.zero;
GameManager.Instance.Inventory.DropItemFromSlot(ParentSlot.SlotIndex);
}
else
{
// UI 위이긴 한데 (예: 인벤토리 빈 여백, 다른 창) 슬롯이 아니라서 드롭 처리가 안 된 경우 -> 제자리 복귀
transform.SetParent(ParentSlot.transform);
transform.localPosition = Vector3.zero;
}
}
//드래그를 취소했을때 툴팁이 다시 나와야됨
GameObject overObj = eventData.pointerCurrentRaycast.gameObject;
if (overObj != null)
{
// 만약 마우스 아래에 슬롯이 있다면 그 슬롯의 아이템정보로 툴팁 띄우기
InventorySlot slot = overObj.GetComponentInParent<InventorySlot>();
if (slot != null)
{
if (slot.currentItem != null && slot.currentItem.Data != null)
{
GameManager.Instance.InGameUI.TooltipUI.ShowTooltip(slot.currentItem, slot.GetComponent<RectTransform>());
}
}
}
}
}