button을 눌렀는데, player input도 같이 들어간다??

오랜만의 포스팅이다. 별건 아니고 겨울방학때 강좌를 보고 만들었던 게임에 살을 덧붙이고 있던 중에 unexpected situation을 만나게 되었다. 상황은 이렇다.

게임 중 잠깐 멈추어야 할 때가 있을 것이다. 그래서 오른쪽 상단에 pause 버튼을 만들고 잠깐 멈추게 할 수 있는 기능을 제공했다.

눌러봤더니 pause도 아주 잘먹히고 좋다. 참고로 pause를 누르면 게임 진행 상황이 멈춰야 하는데, 즉 시간이 멈춰야 한다. Time.timescale의 value를 0으로 하면 멈추고, 1로 정하면 다시 현재 시간의 흐름이 재생된다. 물론 그 사이의 값이나 아예 1 초과로 set할 수도 있다. 그럼 시간의 흐름이 몇 배속이 될 것이다.

문제는.. 캐릭터가 점프를 하면서 멈춰버린다.

왜냐고? 캐릭터 점프 트리거 키도 마우스 왼쪽 클릭이기 때문이다. pause 버튼을 누르면 같이 인식되어 캐릭터도 덩달아 한번 점프를 하게 되고 그 다음 pause가 들어가게 된 것이다.

이거 때문에 유니티 공식 네이버 블로그에 가입하고 qna도 해보고 똥꼬쇼를 다했지만 결국 해답은 구글링이었다.

https://sangh518.github.io/record/block-event-when-ui-click/

이 분 덕분에 아주 시원하게 해결했다! 핵심은 Unity의 EventSystem을 사용하는 것이다.

using UnityEngine.EventSystems;

아! 그 전에 button에 raycast 처리가 check되어 있는지를 확인해야 한다. 안 건드렸다면 보통은 default로 check되어 있다.

그 다음, 다음 구문으로 다른 input 처리를 감싸면 된다.

 if (!EventSystem.current.IsPointerOverGameObject())
        {
          // ... input 처리
        }

EventSystem.current.IsPointerOverGameObject()가 true를 return할 때는 Raycast Target으로 지정된 object들이 picked되었을 때이다. 그러므로, Raycast Target으로 지정된 object들 중 하나라도 picked되었을 때는 if절 안에 들어가지 않게 되는 것이다.

# tip : 뚱딴지같은 소리지만 visual studio를 IDE로 사용할 시 범위 자동 인덴팅의 default shortcut key는 ctrl + k + f이다. 즉, ctrl + k 다음 ctrl + f를 누르면 된다.

댓글남기기