Prosto

유니티에서 터치 처리하기 본문

Programing/Unity 3D

유니티에서 터치 처리하기

Prosto 2016. 9. 21. 22:47

 

기본적으로 유니티를 하면서 쓰는 기능은 클릭입니다.

if (Input.GetMouseButtonDown(0))   //마우스 좌측 버튼을 누름.
{

    //터치 시 내용 처리.. 

}

이렇게 말이죠.

 

 

Input.GetMouseButtonDown(0) 혹은 (1)을 통하여 마우스 클릭을 받고

그에 맞는 처리를 해주죠.

 

 

그렇지만 우리가 모바일 게임을 만들고 있다면 클릭이 아닌 터치를 써야겠죠?

(클릭은 pc로 테스트할 때 쓰고요.)

 

 

유니티에서 클릭이 아닌 터치를 쓰는 방법을 알아볼까요?

 

 

그렇지만 잠깐 터치를 사용하기에 앞서 생각해볼게 있습니다.

 

마우스는 마우스가 하나라면.. 클릭이 일어나면 동시에 여러 개가 일어날 수 없들지만,

터치의 경우 동시에도 여러 손가락으로 누를 수 있으니

마우스와 달리 여러 개의 터치를 받아야겠죠? (멀티 터치)

 

멀티 터치니, 확인을 할 때에도 for문을 이용하여 멀티 터치가 이루어진 수 만큼 검사를 해야합니다.

 

 

 

일단 유니티에 Touch라는 구조체가 있습니다. 터치 상태나 필요한 정보들을 가지고 있죠.

(상태만 해도 마우스로 따지면 마우스 온, 다운, 무브처럼 터치도 여러 상태가 있을 테니까요.)

 

우리는 이 Touch를 이용해야 합니다.

 

 

실제로 작성한 예제 코드를 볼까요?

 

private Touch tempTouchs;

private Vector3 touchedPos;

private bool touchOn;

 

 ....

 

touchOn = false;

if (Input.touchCount > 0) {    //터치가 1개 이상이면.
    for (int i=0; i<Input.touchCount; i++) {
         tempTouchs = Input.GetTouch (i);
         if (tempTouchs.phase == TouchPhase.Began) {    //해당 터치가 시작됐다면.
             touchedPos = Camera.main.ScreenToWorldPoint (tempTouchs.position);//get world position.
             touchOn = true;     

 
             break;   //한 프레임(update)에는 하나만.
        }
    }
}

 

....

 

 

 

이런식으로 구성해봤습니다.

 

그럼 하나씩 따로 봐볼까요?

 

일단 우리가 위쪽에 변수(혹은 구조체)를 사용하기 위하여 선언했습니다.

Touch 구조체를 임시로 담고있을 tempTouch,

Vector3 터치된 위치 정보를 담고있을 touchedPos,

마지막으로 bool 값으로 터치가 됐는지 확인하기 위한 touchOn입니다.

 

 

if (Input.touchCount > 0)으로

현재 터치된 수를 세어봅니다. 하나도 없으면 나머지 확인을 하지 않겠죠?

 

 

다음으로

for (int i=0; i<Input.touchCount; i++)

이 부분에서는 아까 봤던 Input.touchCount를 통해 입력받은 숫자만큼 for문을 돌도록 합니다.

 

  여기서 tempTouchs에 현재 입력된 터치에 대한 정보를 얻어옵니다.

  그리고 현재 해당되는 터치가 어떤 상태인지 확인합니다.

  if (tempTouchs.phase == TouchPhase.Began)

  이렇게 현재 터치 상태가 Began(시작)이라면 그에 맞는 처리를 해주는 거죠.

 

터치 상태를 나타내는 TouchPhase에는 어떤 것들이 있을까요?

Began(터치 시작), Canceled(터치 취소), Ended(터치 종료),

Moved(터치 후 움직임), Stationary(터치 후 대기)

  다섯 종류가 있습니다.

 

필요에 따라 사용하는 거죠.

만약 터치 시작점을 기준으로 현재 터치가 됐는지 확인하고, 터치된 위치값을 받고 싶다면

제가 작성한 코드 같은 식으로 만들어주면 되는 거죠.

 

 

 

그리고 그 밑은 추가적인 부분이지만,

 

touchedPos = Camera.main.ScreenToWorldPoint (tempTouchs.position);

이 부분으로 현재 터치된 위치가 메인카메라 기준의 worldPosition을 얻을 수 있습니다.

 

실제 게임에서 터치된 좌표를 알고자 한다면 이렇게 스크린투월드포인트를 이용하여 값을 얻어야합니다.

그게 캐릭터가 이동하고 싶은 위치든, 공격을 하려는 위치든 상대적으로 사용하려면

터치된 곳의 좌표도 게임 세상의 좌표와 같아야 하니까요.

 

 

 

여기서 사용된 break;도 마찬가지입니다.

만약 게임에서 한 프레임에 터치가 하나만 있어도 충분하다면

그 터치된 위치만을 기준으로 처리해주면 됩니다.

그래서 터치 정보를 하나만 받고 그 뒤는 볼 필요도 없으니 브레이크를 걸어 검사를 끝냈죠.

 

 

 

이렇듯 터치 처리를 이용하여 게임에서 실제로 필요한 기능을

구현하고 사용하시면 됩니다.

(만약 특정 터치를 기억하고 해당 터치 반응을 확인하고 싶다면 Touch 구조체에 fingerID도 있고요..) 

 

 

기본적으로 클릭과 크게 다르지는 않습니다.

클릭으로 구현할 수 있다면 터치로도 구현할 수 있을 겁니다.

 

 

 이떄 UI 클릭(터치)과 게임 화면 클릭(터치) 구분이 필요하다면?

 

 

궁금한 점 있으시면 댓글이나 따로 메일로 질문하시면 시간되는 대로 답변드리겠습니다. ( 연락 )

Comments