공부/인프런 - Rookiss

Part 3-7-2. UI : Button Event, IsPointerOverGameObject()

셩잇님 2023. 8. 23. 18:33
반응형

 

 

UI

팝업창

 

Managers.Resource.Instantiate("UI/PopUp_Canvas"); // 팝업 UI 캔버스 프리팹 생성. 이전에 📜ResourceManager 참고

 

게임에는 수 많은 팝업 UI 가 사용될 수 있다. 그러려면 각각의 팝업 UI 들이 독립적인 캔버스가 있어야 하고 이를 프리팹으로 만들어두어 그때 그때 생성하는 방식으로 사용해야 한다. 캔버스들은 서로 캔버스의 sort order 에 의하여 먼저 그려지고 가장 위에 그려지고 이런 순위가 결정된다.

 


 

UI 입력 이벤트만 처리

 

using UnityEngine.EventSystems;

//..

if (EventSystem.current.IsPointerOverGameObject())
    return;

 

IsPointerOverGameObject()

  • 마우스 클릭 이벤트가 UI 위에서 이루어졌다면 true 리턴. 보다 정확히 말하면 마우스 포인터가 EventSystem 오브젝트 위에 있다면 True
  • 플레이어가 마우스 클릭한 곳으로 이동하는 로직이 있다면, 클릭 버튼을 누를 때 플레이어가 그 클릭 버튼으로 이동하면 안된다. 그냥 클릭 버튼 이벤트만 처리 되야 한다. 따라서 이럴때 마우스 클릭 이벤트가 UI 위에서 이루어진 것이라면 위와 같은 코드를 통해 플레이어 이동을 하지 않도록 할 수 있다.
  • current 👉 현재 EventSystem 리턴

 

 


 

UI 자동화가 필요한 이유

 

[SerializedField] Text _text;

int _score = 0;

// 버튼을 클릭할 때마다 텍스트 UI 의 점수 업데이트
public void OnButtonClicked()
{
    Debug.Log("ButtonClicked");
    _score++;
    _text.text = $"점수 : {_score}";
}


게임의 규모가 커지면 에디터 툴로 UI 들을 관리하기엔 너무 어렵다. 만약 버튼 하나 눌리면 실행되야 할 함수가 50개라면? 툴에 일일이 스크립트를 등록해 주는 것도 힘들고 실수가 발생할 확률도 높아질 뿐더러 원인을 찾기도 힘들어진다. 또한 [SerializedField]를 통해 참조하고 할당해주어야 할 다른 UI 들도 정말 많아질 것이다. 

 

 하지만, 툴로 구현할 수 있는 모든 것은 다 코드로도 구현할 수 있다. UI 자동화를 통해, 이름만으로 자동으로 UI 오브젝트들을 찾고 이를 연결해서 버튼 이벤트에 등록시켜보자. 다음 포스팅부터!

 

 

반응형