noname02

모바일 화면 터치 구현하기. 본문

Study/UNITY

모바일 화면 터치 구현하기.

kimtaku 2015. 5. 15. 18:57
모바일 터치 입력을 구현해 보자.

유니티는 멀티터치를 지원한다.

화면을 터치하게 되면, 화면을 터치한 순서대로 해당 터치의 정보는 터치정보를 담는 배열에 들어가는데 0, 1, 2 순서대로 들어간다.

그리고 이러한 터치정보는 Input.GetTouch(index) 로 얻어올 수 있다.

index는 int형이며 위에서 말했다싶이 터치의 인덱스 값이다.


Input.GetTouch(index)는 Touch 클래스로 그 정보를 반환하므로


Touch touch = Input.GetTouch(index);


와 같은 형태로 해당 터치정보를 참조변수 touch로 접근할 수 있게 하면 된다.


만약 화면 3곳을 터치하고 있으면 index값 0,1,2에 각각 그 정보가 들어가는 것이다.

그런데 여기서 3곳을 터치하고 있다가 두 번째로 터치한 손을 놔 버리면, GetTouch(1)은 null값이 된다. 그러면 유효한 index는 0과 2인 것이다. 그리고 다시 또 터치하게 되면 GetTouch(1)로 해당 터치의 정보가 들어간다.


Touch에 입력되는 정보는 대표적으로 터치된 좌표값(x,y), 터치의 phase값(단계값)을 많이 사용한다.

좌표값이야 말 그대로 좌표값이고, 해당 좌표의 정보는 touch.position에 담기며 이는 Vector2 값으로 x, y의 값은 각각 touch.position.x , touch.position.y로 접근할 수 있다.


phase값은 터치의 상태를 뜻하는데

터치의 상태에는 


TouchPhase.Began

TouchPhase.Moved

TouchPhase.Stationary

TouchPhase.Ended

TouchPhase.Canceled


가 있다. TouchPhase는 enum으로 정의된 값이다.


우선 TouchPhase.Began은 터치가 시작되었을 때이다.


if(touch.phase==TouchPhase.Began)    // 여기서 touch는 위에서 정의한 Touch touch=

Debug.Log("Touch Began!")


라면 터치가 입력되었을 때 로그창에 Touch Began!이 한 번 출력된다.


TouchPhase.Moved는 TouchPhase.Began 다음에 움직이고 있는 상태다.


그러니까 화면을 터치하면 TouchPhase.Began 상태였다가 움직이고있으면 TouchPhase.Moved 상태인 것이다.


if(touch.phase==TouchPhase.Moved)

Debug.Log("Touch Moved!")


라면 터치한 상태로 움직이는 동안 계속 로그창에 Touch Moved! 가 출력된다.


TouchPhase.Stationary는 Moved상태였다가 가만히 있을 때의 상태다.


if(touch.phase==TouchPhase.Stationary)

Debug.Log("Touch Stationary!")


라면 터치한 상태로 움직이다가 가만히 있는 경우 Touch Stationary! 가 계속 출력된다.


TouchPhase.Ended는 화면에서 손을 뗐을 때의 상태다.


if(touch.phase==TouchPhase.Ended)

Debug.Log("Touch Ended!")


화면에서 손을 떼면 Touch Ended! 가 한 번 출력된다.


TouchPhase.Canceled는 시스템에 의해 터치가 취소된 경우다.

즉 사용자가 화면에서 손을 뗀 것이 아니라, 전화가 왔다던지 등등 이러한 상황일 때다.


대개 if문을 사용하지 않고 switch 문을 사용한다. TouchPhase가 enum으로 정의되어 있기 때문에 switch로 정의하는 것이 효율적이다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
if (Input.touchCount > 0)
 {
       Touch touch = Input.GetTouch(0);
       switch (touch.phase)
       {
           case TouchPhase.Began:
               Debug.Log("TouchPhase Began!");
              
               break;
 
           case TouchPhase.Moved:
               Debug.Log("TouchPhase Moved!");
 
               break;
 
           case TouchPhase.Stationary:
               Debug.Log("TouchPhase Stationary!");
 
               break;
 
           case TouchPhase.Ended:
               Debug.Log("TouchPhase Ended!");
 
               break;
 
           case TouchPhase.Canceled:
               Debug.Log("TouchPhase Canceled!");
 
               break;
       }
}

cs



1 : Input.touchCount는 현재 터치되고 있는 갯수를 의미한다. 1이면 현재 터치가 하나이고, 2면 두개, 3이면 세개 이렇게 된다.


3 : Input.GetTouch(0)은 맨 처음 터치된 터치의 정보다. 즉 이 경우에는 싱글터치를 구현하고 있으므로 화면을 여러개 터치하면 Input.GetTouch(1), Input.GetTouch(2) 등등 터치 정보가 있겠지만 맨 처음 터치된 0만을 사용하겠다는 의미다. 즉 싱글터치만을 사용하겠다는 의미다.


4. touch.phase 는 touch에 터치 상태다. enum인 TouchPhase의 값이 터치의 상태에 따라 들어가 있을테니 이를 switch문으로 분기를 나눠서 각각 상태마다 스크립트를 작성할 수 있게 한다.






'Study > UNITY' 카테고리의 다른 글

Rigidbody2D 옵션  (0) 2015.05.15
플랫폼에 따른 전처리 지시자  (0) 2015.05.15
Singleton(싱글톤) 객체 만들기  (0) 2015.05.14
Coroutine(코루틴) 실용적인 정리.  (0) 2015.05.07
Coroutine  (0) 2015.05.04
Comments