본문 바로가기
취미/게임 개발

[Unity] 게임 개발 - 드래그 앤 드롭

by krapoi 2021. 12. 20.
반응형

이번에 만들어볼 기능은 드래그 앤 드롭이다.

 

게임 개발을 하다 보면 드래그 기능이 필요할 때가 있다.

이런 거 말이다.

 

지금은 드래그할 때와 드롭할 때의 간단한 부분만 만들어 볼 것이다.

드래그와 드롭 시 원래 자리를 찾아가는 기능을 말이다.

 

일단 드래그 앤 드롭은 캔버스 안에 있는 오브젝트들이 움직인다.

내가 혼자서 스프라이트 만들어둔 거에 적용해 봤는데 안돼서 어떻게든 해보려고 하다가 포기했다. (정확하게는 따로 만들어 줘야 하는데 몰랐기 때문)

 

그러니 일단 캔버스를 하나 만들어 주자.

우클릭을 한 뒤 UI에 들어가 보면 있다.

 

그 뒤에 캔버스 안에 Image를 하나 만들어 사용하였다.

사실, 드래그 앤 드롭 사용할 때 Image 말고 딱히 사용할 일은 없을 듯.

 

나는 방금 만든 캔버스의 이름을 MainActivity로 지정하고 그 캔버스의 자식으로 Seed라는 사각형 이미지로 만들었다.

딱히 이미지를 건들건 없고 이미지에 스크립트만 넣어 주면 된다.

 

그러면 이제 스크립트를 보자.

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;

public class Drag : MonoBehaviour, IBeginDragHandler, IEndDragHandler, IDragHandler
{
    public static Vector2 DefaultPos;

    void IBeginDragHandler.OnBeginDrag(PointerEventData eventData)
    {
        DefaultPos = this.transform.position;
    }

    void IDragHandler.OnDrag(PointerEventData eventData)
    {
        Vector2 currentPos = eventData.position; 
        this.transform.position = currentPos;

   
    }

    void IEndDragHandler.OnEndDrag(PointerEventData eventData)
    {
        Vector2 mousePos = Camera.main.ScreenToWorldPoint(Input.mousePosition); 
        this.transform.position = DefaultPos;

    }
}

 

이번에 새로 추가해 줘야 할 부분이 있는데

이 부분의 UnityEngine.EventSystems이다.

이거 추가 안 하면

이 부분 작성이 안됨.

그리고 이 부분을 작성하게 되면 인터페이스라서 재정의 하라고 말하는데 전구 눌러서 모든 멤버를 명시적으로 구현을 눌러주면 된다.

 

 

그다음으로 우리가 오브젝트를 놓았을 때(드롭했을 때) 돌아올 위치를 알아야 하니, DefaultPos로 현재 위치를 지정해 준다.

 

그리고 이제 각각 재정의를 해주면 된다.

먼저 드래그를 시작했을 때 즉 클릭 시이다.

클릭 시 지금의 위치를 DefaultPos로 정한다.

 

그다음 드래그 중일 때.

Vector2로 지금 드래그 중인 위치를 가져와 지금 오브젝트의 위치로 지정한다.

 

마지막으로

드래그를 끝냈을 때,

지금 오브젝트의 위치를 DefaultPos로 바꾼다.

지금 마우스 위치도 만들어 놨는데

마우스 위치에 놔두고 싶으면 DefaultPos대신 mousePos를 두면 된다.

 

반응형