Prosto

유니티 클릭(터치)처리에서 UI 제외하기 본문

Programing/Unity 3D

유니티 클릭(터치)처리에서 UI 제외하기

Prosto 2016. 9. 22. 02:51

 

유니티에서 화면에 클릭 혹은 터치를 주는 경우

UI로 구성된 부분을 클릭해도 UI 버튼 처리와 클릭 처리를 같이해주게 됩니다.

 

이때, UI를 클릭(터치)하는 경우에는 게임 화면을 클릭한 처리에서 제외해주고 싶다면

이 글에서 소개하는 내용을 보시면 됩니다.

 

 

 

게임에서 UI 부분을 눌렀더니 점프를 한다?

(점프하면 안 되는데... 이런 경우에는?)

 

이런 경우 터치 혹은 클릭된 부분이 게임 화면인지, 아니면 UI인지 확인하여 처리해주면 됩니다.

 

그 기능을 사용하기 위해선 먼저 클릭/터치 처리하는 해당 스크립트에 추가로 using해줍니다.

 

using UnityEngine.EventSystems;    //UI 클릭시 터치 이벤트 발생 방지.

 

(여기서 EventSystems를 사용하기 위해선 일단 UI는 만들었어야 합니다.

 그때 아래와 같이 자동으로 Hierarchy 패널에 EventSystem이 추가되니까요.)

 

 

다음으로 클릭하는 부분에서도 처리를 해줘야겠죠?

 

if ((Input.GetMouseButtonDown(0)))  //버튼을 누름.
{
    if (EventSystem.current.IsPointerOverGameObject() == false)
    {  //UI이 위가 아니면.
         StartCoroutine("CheckButtonDownSec");
    }

}

 

'EventSystem.current.IsPointerOverGameObject() == false'

확인을 Input을 받은 후에 하든, 받기 전에 하든 순서는 관계 없습니다.

그저 현재 포인트가 어디에 있는지 확인하는 거니까요.

 

(UI 중 어떤 것이라도(텍스트라도) Raycast Target이 켜져있다면 게임 클릭에서 제외하여 UI만의 세계가 되는 겁니다.)

 

이벤트(Click On 등)와도 관계 없고, Raycast Target와 관계가 있는 겁니다.

 

(반대로 얘기하면 UI에서 이 Raycast Target이 꺼져있다면 UI 위를 클릭해도 게임 내 해당 좌표를 클릭한 효과를 주는거죠.)

 

 

 

 

그렇다면 터치에서는 어떻게 적용할까요?

 

일단

using UnityEngine.EventSystems;    //UI 클릭시 터치 이벤트 발생 방지.

여기는 똑같이 사용합니다.

 

그렇지만, 클릭과 터치 처리 자체가 다르니.. 살짝 다르겠죠? 예제 코드를 보여드리겠습니다.

 

if (Input.touchCount > 0) {    //터치가 1개 이상이면.
    for (int i=0; i<Input.touchCount; i++) {
         if (EventSystem.current.IsPointerOverGameObject (i) == false) {
             tempTouchs = Input.GetTouch (i);
             if (tempTouchs.phase == TouchPhase.Began) {    //해당 터치가 시작됐다면.
                 touchedPos = Camera.main.ScreenToWorldPoint (tempTouchs.position);//get world position.
        
                 touchOn = true;
        
                 break;   //한 프레임(update)에는 하나만.
            }
        }
    }
}

 

터치를 사용할줄 알고있다면, 어떤 부분에서 처리해줘야하는지 아시겠죠?

 

EventSystem.current.IsPointerOverGameObject (i) == false

이렇게 다른 부분이라고는 터치 번호가 들어가는 i뿐 입니다.

현재 터치되고 있는 번호에 맞게 검사하는 거죠.

 

 

이렇게 처리해주고 실행하면 UI와 게임 내 터치가 구분되어집니다.

(아까 얘기했지만, EventSystem은 있어야 합니다..)

 

 

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

Comments