카테고리 없음

유니티 터치(Touch) 입력 기초

yonan 2020. 9. 5. 18:55

https://m.blog.naver.com/PostView.nhn?blogId=pxkey&logNo=221312986925&proxyReferer=https:%2F%2Fwww.google.com%2F

 

유니티 터치(Touch) 입력 기초

안녕하세요. 창작자 픽케입니다.​우리는 Window PC나 MacOS 환경에서 유니티 에디터를 통해 개발 작...

blog.naver.com

 

 

우리는 Window PC나 MacOS 환경에서 유니티 에디터를 통해 개발 작업을 진행하지만, 실제로 애플리케이션이 실행되는 모바일 장치의 특성을 고려해서 프로그램을 설계해야 합니다. 모바일 게임 개발에서 우선 고려해야 할 대표적인 특성은 모바일 장치의 다양한 화면 해상도(Screen Resolution)터치(Touch) 기반의 조작이라고 할 수 있습니다.

화면 해상도는 유니티 에디터 실행 뷰(Runtime View)의 옵션을 통해 예측이 가능하고, 캔버스(Canvas) 시스템의 Anchor와 Pivot, Layout Component 등을 통해 어느 정도 유연한 레이아웃(Layout)을 구성할 수 있습니다. 그러나 손가락 터치를 통해 게임 속 요소와 상호 작용(Interaction) 할 수 있도록 구현하는 것은 사실 까다로운 부분이 있는데요? 마우스의 클릭(Click)은 화면의 여러 위치에서 동시에 발생할 수 없지만, 터치(Touch)는 손가락 여러 개가 동시에 눌러질 수도 있기 때문입니다.

따라서 오늘은 Android 운영체제 환경에서 사용자의 손가락 터치를 처리하는 기본적인 방법에 대해 알아보도록 하겠습니다. 유니티 에디터가 실행중인 개발 PC와 안드로이드폰을 USB 케이블로 연결하고, Unity Remote 5 애플리케이션을 이용해 사용자의 터치 입력을 테스트하는 방법은 아래 첨부한 지난 포스팅 링크를 통해 확인하시길 바랍니다.

 

유니티 Unity Remote 5를 이용한 장치 테스트

안녕하세요. 창작자 픽케입니다.키보드나 마우스 등의 PC 기반 표준 입출력이 아닌, 터치(Touch), 드래...

pxkey.blog.me

Input 클래스의 touchCount 속성은 모바일 장치 화면에 접촉되어 있는 손가락(Finger)의 갯수를 의미합니다. 보통 if 구문을 이용하여 touchCount가 0보다 크면, 터치가 발생한 것으로 처리합니다.

void Update(){ Debug.Log(Input.touchCount); }

Input 클래스의 GetTouch 메서드는 매개 변수로 전달한 모바일 장치 화면에 접촉한 손가락의 순서에 해당하는 터치의 상태를 나타내는 Touch 구조체를 반환합니다. ( 보통 여러개의 손가락을 활용하는 시스템이 아니라면, 화면에 처음으로 접촉한 터치 정보를 이용해서 동작을 처리합니다. 이것을 '싱글 터치'라고 주로 표현합니다. ) 따라서 GetTouch 메서드로 얻게된 Touch 구조체의 position 속성을 통해 해당 터치의 위치(Position) 좌표 정보를 알아낼 수 있습니다.

 

void Update(){ Debug.Log(Input.GetTouch(0).position); }

Touch 구조체의 deltaPosition 속성은 가장 마지막의 프레임에서 발했던 터치의 위치와 현재 프레임에서 발생한 터치 위치의 차이를 의미합니다. 이 속성은 터치의 이동 방향을 추적해야 하는 상황에서 활용할 수도 있습니다.

void Update(){ Debug.Log(Input.GetTouch(0).deltaPosition); }

deltaPosition 속성의 값을 이용하여 게임 오브젝트의 위치를 이동시켜 보면, 더 쉽게 파악할 수 있습니다.

public GameObject tempObj; void Update(){ tempObj.transform.Translate(Input.GetTouch(0).deltaPosition * Time.deltaTime * 1.0f); }

Touch 구조체의 tapCount는 특정 위치에 접촉되어 있는 손가락에서 연속적으로 일어난 탭(Tap)의 수를 확인하기 위해서 사용합니다.

Touch.tapCount

TouchPhase가장 최근의 프레임에서 손가락이 취한 동작을 나타냅니다. Touch 구조체의 phase 속성과 TouchPhase의 열거형 값을 비교해서 현재 터치의 상태를 확인할 수 있습니다.

Began (터치 시작)

손가락이 화면을 터치하는 그 순간

Moved (터치 이동)

손가락이 화면 위에서 터치한 상태로 이동하고 있는 상태

Stationary (터치 대기)

손가락이 화면을 터치했지만, 마지막 프레임에서 변화가 없는 상태

Ended (터치 종료)

손가락이 화면 위를 벗어나 떨어지게 되는 그 순간, 터치가 끝난 상태

Canceled (터치 취소)

5개를 이상의 터치 입력이 동시에 발생해서 시스템이 터치의 추적을 취소한 상태

Touch 객체의 상태를 나타내는 TouchPhase를 통해 현재 터치의 상태를 확인할 수 있는 코드는 아래와 같습니다. ( 참고로, TouchPhase가 열거형이기 때문에 사실 if 보다는 switch가 더 효율적일 수 있습니다. )

void Update(){ if(Input.touchCount > 0){ Touch touch = Input.GetTouch(0); if(touch.phase == TouchPhase.Began){ Debug.Log("Began : "+touch.position); } if(touch.phase == TouchPhase.Moved){ Debug.Log("Moved : "+touch.position); } if(touch.phase == TouchPhase.Ended){ Debug.Log("Ended : "+touch.position); } } }

터치를 이용한 게임 오브젝트 픽킹(Picking)과 드래그(Drag)를 처리하는 방법은 다음 포스팅에서 연재할 예정입니다.