Prosto
유니티 클릭(터치)처리에서 UI 제외하기 본문
유니티에서 화면에 클릭 혹은 터치를 주는 경우
UI로 구성된 부분을 클릭해도 UI 버튼 처리와 클릭 처리를 같이해주게 됩니다.
이때, UI를 클릭(터치)하는 경우에는 게임 화면을 클릭한 처리에서 제외해주고 싶다면
이 글에서 소개하는 내용을 보시면 됩니다.
게임에서 UI 부분을 눌렀더니 점프를 한다?
(점프하면 안 되는데... 이런 경우에는?)
이런 경우 터치 혹은 클릭된 부분이 게임 화면인지, 아니면 UI인지 확인하여 처리해주면 됩니다.
그 기능을 사용하기 위해선 먼저 클릭/터치 처리하는 해당 스크립트에 추가로 using해줍니다.
(여기서 EventSystems를 사용하기 위해선 일단 UI는 만들었어야 합니다.
그때 아래와 같이 자동으로 Hierarchy 패널에 EventSystem이 추가되니까요.)
다음으로 클릭하는 부분에서도 처리를 해줘야겠죠?
{
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 위를 클릭해도 게임 내 해당 좌표를 클릭한 효과를 주는거죠.)
그렇다면 터치에서는 어떻게 적용할까요?
일단
여기는 똑같이 사용합니다.
그렇지만, 클릭과 터치 처리 자체가 다르니.. 살짝 다르겠죠? 예제 코드를 보여드리겠습니다.
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은 있어야 합니다..)
궁금한 점 있으시면 댓글이나 따로 메일로 질문하시면 시간되는 대로 답변드리겠습니다. ( 연락 )
'Programing > Unity 3D' 카테고리의 다른 글
따라하는 유니티 2D 프로젝트ⓐ -10 (0) | 2016.09.23 |
---|---|
따라하는 유니티 2D 프로젝트ⓐ -9 (8) | 2016.09.22 |
유니티에서 터치 처리하기 (4) | 2016.09.21 |
따라하는 유니티 2D 프로젝트ⓐ -8 (11) | 2016.09.21 |
따라하는 유니티 2D 프로젝트ⓐ -7 (6) | 2016.09.19 |