반응형
- 코드 작성
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;
}
}
반응형
'개발 > C#' 카테고리의 다른 글
유니티 C# 인터넷 시간 가져오기 간단 구현 Unity Internet Time (0) | 2024.02.14 |
---|---|
유니티 C# 인앱결제 영수증 검증하는 방법 간단 구현 (0) | 2024.02.14 |
유니티 C# 플레이어 몬스터 충돌 파티클 생성 간단 구현 (0) | 2024.02.14 |
유니티 C# 인앱 리뷰 시스템 간단 구현 Google Play In-App Review API (0) | 2024.02.14 |
유니티 C# 카메라 자유롭게 자유시점으로 이동하기 간단 구현 (0) | 2024.02.14 |
유니티 C# 인앱결제 시스템 간단 구현 Unity IAP System (0) | 2024.02.14 |
유니티 C# 구글 애드몹 보상형 전면 광고 간단 구현 Admob 8.7.0 (0) | 2024.02.14 |
유니티 C# 구글 애드몹 테스트 광고 id 설정 간단 구현 Google Admob Test id (0) | 2024.02.14 |
댓글