본문 바로가기
NOTE/Unity

[Unity] Mobile Touch (펌)

by DevAthena 2016. 10. 13.

출처 : http://noname2.tistory.com/110


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

화면을 터치하게 되면, 화면을 터치한 순서대로 해당 터치의 정보는 터치정보를 담는 배열에 들어가는데 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로 정의하는 것이 효율적이다.



if(Input.touchCount == 1)
        {
            Touch touch = Input.GetTouch(0);
            switch (touch.phase)
            {
                case TouchPhase.Began:
                    showT.text = "TouchPhase Began!";
                    break;
                case TouchPhase.Moved:
                    showT.text = "TouchPhase Moved!";
                    break;
                case TouchPhase.Stationary:
                    showT.text = "TouchPhase Stationary!";
                    break;
                case TouchPhase.Ended:
                    showT.text = "TouchPhase Ended!";
                    break;
                case TouchPhase.Canceled:
                    showT.text = "TouchPhase Canceled!";
                    break;
            }
            showT.text = touch.tapCount.ToString() + "!!";
        }



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


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


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



참고 

http://blog.daum.net/zevie/21

http://devkorea.co.kr/reference/Documentation/ScriptReference/Input.GetTouch.html

https://docs.unity3d.com/kr/current/ScriptReference/Input.GetTouch.html

에셋

https://www.assetstore.unity3d.com/kr/#!/content/41076
https://www.assetstore.unity3d.com/kr/#!/content/30111