2017. 1. 24. 15:30

전에 4.x버전용 드래그를 구현한 적이 있습니다.

(참고 : [Unity 4] 오브젝트 드래그 하기 )

그런데 5.x용 자료를 보다 보니 드래그 관련 이벤트가 있군요.

언제 생긴 건지 모르겠지만 이것을 이용하면 오브젝트 드래그를 쉽게 구현할 수 있습니다.

 

 

1. 드래그 이벤트

'MonoBehaviour.OnMouseDrag()'이라는 이벤트가 생겼습니다.

 

(참고 : unity documentation - MonoBehaviour.OnMouseDrag() )

오브젝트에 'MonoBehaviour'가 붙어 있다면 그냥 이벤트만 오버라이드해서 사용하면 됩니다.

이 이벤트를 오버라이드한 스크립트를 가지고 있는 오즈젝트는 드래그가 시작되면 이벤트가 넘어옵니다.

 

프로젝트를 생성하고 '3D Text'객체와 'Cube'객체를 화면에 올려놔 봅시다.

'3D Text'의 이름을 'DisplayText'으로 바꿉니다.

스크립트를 생성하고 다음 코드를 넣습니다.

public class CDrag : MonoBehaviour
{
    /// <summary>
    /// 3d 텍스트 오브젝트
    /// </summary>
    TextMesh m_textMeshDisplayText;
 
    // Use this for initialization
    void Start ()
    {
        this.m_textMeshDisplayText 
            = (GameObject.Find("DisplayText") as GameObject).GetComponent<TextMesh>();
    }
 
    /// <summary>
    /// 마우스 업 이벤트
    /// </summary>
    void OnMouseUp()
    {
        this.m_textMeshDisplayText.text = "드래그중이 아님";
    }
 
    /// <summary>
    /// 드래그 이벤트
    /// </summary>
    void OnMouseDrag()
    {
        this.m_textMeshDisplayText.text = "드래그중이다!";
    }
}

 

위 코드를 큐브(Cube)에 넣고 실행해 봅시다.

 

큐브를 클릭해서 드래그하려고 하면 메시지가 변경되는 것을 알 수 있습니다.

 

 

2. 오브젝트를 드래그해보자.

스크립트가 옮기려는 객체에 들어 있으므로 자신의 좌표만 수정해주면 됩니다.

이건 이전 코드와 같습니다.

/// <summary>
/// 드래그 이벤트
/// </summary>
void OnMouseDrag()
{
    this.m_textMeshDisplayText.text = "드래그중이다!";
 
    //마우스 좌표를 받아온다.
    Vector3 mousePosition 
        = new Vector3(Input.mousePosition.x, Input.mousePosition.y, 10);
    //마우스 좌표를 스크린 투 월드로 바꾸고 이 객체의 위치로 설정해 준다.
    this.transform.position = Camera.main.ScreenToWorldPoint(mousePosition);
}

 

코드가 참 쉽죠?

자기 자신에서 이벤트가 발생하기 때문에 클릭한 오브젝트를 찾을 필요가 없어서 코드가 간결합니다.

 

코드를 테스트해봅시다.

 

 

마무리

아래 파일을 테스트용 프로젝트입니다.

DragTest.zip
다운로드

 

 

드래그 이벤트 하나만으로 마우스 상태 확인, 클릭 된 오브젝트 찾기 같은 작업이 한 번에 처리 되었습니다!

이런 이벤트는 빨리 좀 만들어주지 ㅎㅎㅎㅎ

설마 이전 버전에도 있었는데 모르고 있던 건가;;;;;