noname02
모바일 화면 터치 구현하기. 본문
유니티는 멀티터치를 지원한다.
화면을 터치하게 되면, 화면을 터치한 순서대로 해당 터치의 정보는 터치정보를 담는 배열에 들어가는데 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 |