툴/유니티

Webgl에서 Canvas Button의 OnClick()기능으로 CursorLockMode제어 문제

스튜디오 오버그래픽스 2021. 11. 12. 16:17

webgl로 만든 게임이 1인칭 시점일 경우

커서가 보여서 돌아다니면 안되고 고정되어 있어야 한다.

그럴 경우 

Cursor.lockState = CursorLockMode.Locked;
Cursor.lockState = CursorLockMode.Confined;

커서 LockMode를 Locked 혹은 Confined를 쓰고

Cursor.visible = false;

커서가 안보이게 Visible을 False로 설정한다

 

 

 

 

그러다가 인터페이스나, 인벤토리창, 메뉴창 처럼 2D창을 클릭해야되는 상태면

마우스 커서가 보이고 마우스가 돌아다닐수 있게 해야한다.

그럴경우

Cursor.lockState = CursorLockMode.None;

커서 LockMode를 None으로 놓고

Cursor.visible = true;

커서가 보이게 Visible을 true로 설정한다

 

 

 

 

위와 같은 기능은 에디터 상에서 잘 작동하지만

webgl에서 Canvas의 Button에서 Onclick()기능을 쓰게 되면 문제가 된다.

예를 들어 인터페이스 창을 닫는 버튼을 Onclick()기능을 쓰고

Onclick()으로 호출하는 명령어가 

Cursor.lockState = CursorLockMode.Locked;

Cursor.visible = false;

일 경우

마우스가 커서에 위 기능이 바로 적용이 안돼서 한번 더 클릭해야 된다.

 

그래서 대안 책으로 Onclick()을 쓰지않고

Trigger Event의 Select()를 사용한다.

그러나 Select()로 쓸경우 오브젝트가 선택 되었을때 한번 호출되지만

다시 클릭할경우 호출이 되지 않는다.

Select()가 다시 호출되려면 다른 오브젝트를 클릭하고 오거나 Deselect상태가 되어야 한다.

그래서

GetComponent<UnityEngine.EventSystems.EventSystem>().SetSelectedGameObject(null);

 

 

EventSystem에서 Select된 오브젝트를 다 Deselect시키는 명령어를

호출해야한다.

그러나 Select()와 동시에 호출될경우 에러가 나기 때문에

위 명령어는 Invoke를 쓰거나 해서 시간 차를 두고 명령어를 호출 해야 한다.