소소한 개발 공부

[유니티|2D] 터치로 UI 오브젝트, 월드 오브젝트 이동하기 본문

개발/Unity

[유니티|2D] 터치로 UI 오브젝트, 월드 오브젝트 이동하기

이내내 2021. 8. 19. 15:56

게임에서 건물 같은 오브젝트의 위치를 터치로 이동할 때 오브젝트에 딸린 UI도 같이 움직여야 한다.

Input.mousePosition을 사용한다.

 

public void OnDrag(PointerEventData eventData)
{
	if (!isPointerDown)
		return;
        
	// 이동 모션
	// 월드 상의 오브젝트 이동
	this.transform.position = Camera.main.ScreenToWorldPoint(Input.mousePosition);
	// 혹은 eventData 이용
	this.transform.position = Camera.main.ScreenToWorldPoint(eventData.position);
    
	this.transform.position -= new Vector3(0,0,-10);	// ScreenToWorld를 하게 되면 z축값=-10
	// UI 오브젝트 이동
	editModes.transform.position = Input.mousePosition;
}

위 메서드가 담긴 스크립트는 다음을 포함해야 한다.

 

1. using UnityEngine.EventSystems;

으로 EventSystems을 추가하고 (IDragHandler 인터페이스를 가진 네임스페이스)

 

2. IDragHandler 인터페이스를 상속 받아야한다. (OnDrag 함수를 오버라이딩하기 위해)


isPointerDown : 현재 이 오브젝트가 이동가능한 상태인지를 나타내는 bool 변수 (true일 때 이동 가능)

 

[월드 오브젝트 이동]

this.transform.position = Camera.main.ScreenToWorldPoint(Input.mousePosition);

: this.transform.position 은 이 스크립트를 가진 월드 오브젝트의 위치를 나타낸다.

월드 오브젝트를 마우스 위치(스크린 상 위치, Input.mousePosition)에 따라 이동시킨다. 

ScreenToWorldPoint는 스크린 상의 값을 월드 상의 값으로 바꿔준다.

ex) 해상도가 720*1280일 때 화면 가운데를 클릭하면 마우스 위치는 (360, 640, 0)이 된다.이를 ScreenToWorldPoint로 변환하면 (0,0,-10)이 된다.(= 월드 상 가운데)따라서 필요에 따라 z축값을 0으로 맞춰준다.

 

[UI 오브젝트 이동]

editModes.transform.position = Input.mousePosition;

: editModes는 GameObject로 선언된 변수이며, UI 오브젝트를 할당해 사용한다.

마우스 터치로 이 오브젝트를 이동할 때 마우스 위치에 따라 이동해야 하기 때문에

오브젝트의 위치를 마우스 위치(Input.mousePosition)을 넣어준다.