프로그래밍/유니티 및 C#

[유니티/C#] 드래그 앤 드롭(Drag and Drop) 시스템 만들기

바토파 2023. 10. 31. 19:23
반응형

음식 오브젝트를 Drag and Drop으로 손님에게 서빙하는 장면

짤처럼 음식을 드래그 해서 손님한테 주는 시스템을 만들었다.

 

// 음식 오브젝트에 넣은 코드
public class FoodController : MonoBehaviour, IBeginDragHandler, IEndDragHandler, IDragHandler
{
    Vector3 DefaultPos;
	
    // 드래그 시작
    void IBeginDragHandler.OnBeginDrag(PointerEventData eventData)
    {
    	// 올바르지 않은 곳에 드래그 했을 때 돌아갈 위치를 저장해준다
        DefaultPos = this.transform.position; 
        // 드래그 시작 되었을 때는 드래그 중인 오브젝트의 레이캐스트 타겟을 꺼줘야 오류가 생기지 않는다
        GetComponent<Image>().raycastTarget = false; 
    }
	
    // 드래그 중
    void IDragHandler.OnDrag(PointerEventData eventData)
    {
    	// 현재 터치되고 있는 좌표를 저장해서 오브젝트가 손가락을 따라갈 수 있도록 오브젝트의 좌표로 넣어준다
        Vector3 currentPos = Camera.main.ScreenToWorldPoint(eventData.position);
        
        // 이렇게 넣어주지 않으면 오브젝트가 이상한 곳에 위치하길래 조정해주었다
        // 원인을 아시는 분은 댓글로 알려주시면 감사하겠습니다
        currentPos.z = 90f;
        currentPos.y -= 160f;
        this.transform.position = currentPos;
    }
	
    // 드래그 끝
    void IEndDragHandler.OnEndDrag(PointerEventData eventData)
    {
    	// 손님 오브젝트에서 음식 오브젝트에 대한 처리를 하고 오브젝트를 제거한다
        // 제거되지 않았다면 올바르지 않은 곳에 드롭된 것이기 때문에 원래 위치로 돌려준다
        this.transform.position = DefaultPos;
        // 레이캐스트 타겟도 원래대로 돌려준다
        GetComponent<Image>().raycastTarget = true;
    }
}
// 손님 오브젝트에 넣은 코드
    public class SeatController : MonoBehaviour, IDropHandler
    {
        public Text dialogue;
        public GameObject heartImg;
        public string residentName;
		
        // 오브젝트가 드롭되었을 시 호출되는 함수
        public void OnDrop(PointerEventData eventData)
        {
            // eventData.pointerDrag로 드롭된 오브젝트를 가져올 수 있다
            // 원하는 코드를 짠다
			
            // 원하는 행동을 한 후 음식 오브젝트를 제거한다
            Destroy(eventData.pointerDrag);
        }
    }

using UnityEngine.EventSystems; 을 해줘야 드래그, 드롭 함수를 사용할 수 있다.

드래그 할 오브젝트에는 IBeginDragHandler, IEndDragHandler, IDragHandler를, 드롭 할 오브젝트에는 IDropHandler를 넣어줘야 한다.

반응형