[유니티] Unity MouseEvent, DragEvent

안녕하세요 UnityBeginner입니다.
이번 글에선 오브젝트를 클릭하여 마우스가 움직이는 방향대로 Transform을 변경시키는 방법에 대해 알아보겠습니다.

씬뷰



위 이미지와 마우스를 이용하여 이동시킬 오브젝트들을 생성해줍니다.

스크립트 Cube


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
private float zpos;
    private Vector3 mOffset;

    public void OnMouseDown() {
        zpos = Camera.main.WorldToScreenPoint(gameObject.transform.position).z;
    }

    public void OnMouseDrag() {
        transform.position = GetMousePosition();
    }

    private Vector3 GetMousePosition() {
        Vector3 mousePoint = Input.mousePosition;
        mousePoint.z = zpos;

        return Camera.main.ScreenToWorldPoint(mousePoint);
    }


큐브를 마우스를 클릭, 드래그하여 이동시키는 코드입니다.

Input.mousePosition을 사용하면 Screen좌표에서의 마우스 위치를 가져오므로
이 값을 그대로 큐브의 position에 적용시키면 좌표계가 다르기 때문에 큐브는 
이상한 곳 으로 날아가 버리게됩니다. 
그래서 Camera.main.ScreenToWorldPoint 이용하여 좌표계를 동일하게 
맞춘 후 적용시켜야 오브젝트가 마우스의 위치로 따라오게됩니다.

OnMouseDown

 - 마우스가 클릭된 경우 호출됩니다.

OnMouseDrag

 - 마우스가 클릭되고 움직이는 동안 계속 호출됩니다.

OnMouseUp

 - 마우스의 누른버튼을 놓았을 때 호출됩니다.

Camera.main.ScreenToWorldPoint

  - 스크린 좌표에서 월드 좌표로 변환합니다.

Camera.main.WorldToScreenPoint

  - 월드 좌표에서 스크린 좌표로 변환합니다.

이 외에도 다양한 좌표변환이 가능합니다. 


스크립트 UI Button


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
public class UIBtnDrag : MonoBehaviour,IDragHandler, IEndDragHandler, IPointerDownHandler {

    public void OnDrag(PointerEventData eventData) {
        transform.position = eventData.position;
    }

    public void OnEndDrag(PointerEventData eventData) { }

    public void OnPointerDown(PointerEventData eventData) { }
    
}

이번엔 handler를 이용하여 드래그라고 입력되어있는 UI버튼 오브젝트 들을 
클릭 드래그하여 이동시키는 코드입니다.

오브젝트를 선택하면 eventData를 통해서 클릭이 일어난 좌표값을 
가져올 수 있기때문에 마우스를 이용하여 오브젝트의 위치를 변경가능합니다.

※ Handler를 상속받았다면 포함되는 함수를 반드시 사용해야합니다.

OnDrag

  - 마우스가 클릭되고 움직이는 동안 계속 호출됩니다.

OnEndDrag

  - 마우스의 누른버튼을 놓았을 때 호출됩니다.

OnPointerDown

  - 마우스가 클릭된 경우 호출됩니다.



결과화면



영상을 마지막으로 마우스를 이용하여 오브젝트를 이동시키는 
몇가지 방법에 대해 알아보았습니다.

이 기능들을 응용하여 인벤토리내의 아이템을 이동시키거나 
TCG같은 카드게임의 카드들을 이동시키는 데에도 활용이 가능합니다.


댓글