유니티에서 게임을 개발할 때, UI는 빠질 수 없는 요소이다.
UI는 플레이어에게 게임 플레이에 필요한 요소나, 설정, 그리고 기능을 제공한다.
이런 부분에서 UI는 필요할 때 켜고 끄는 방식으로 구현하여, 플레이어의 게임 경험을 더욱 풍부하게 한다.
UI를 활성화/비활성화 방식에 있어서 2가지로 구현할 수 있는데
이에 대해서 실무적인 관점으로 한번 정리해보자.
SetActive()
메소드는 해당 오브젝트 및 모든 하위 오브젝트의 전체 컴포넌트를 비활성/활성화 하는 메소드이다. 기본 형태는 다음과 같다.
public void SetActive(bool value);
대상은 GameObject 인스턴스로 하며,
true 는 활성화, false는 비활성화 한다.
이 메소드가 false 인자로 호출 시, Update와 OnEnable/OnDisable 그리고 Start등이 중단되고
버튼과 토글 등 UI 이벤트가 차단된다.
즉, 다음 프레임부터 랜더, 물리, UI 입력, NavMesh등 모든 엔진 패스에서 제외되는 것이다.
이 함수로 호출 시 엔진 내부 이벤트 순서는 다음과 같다.
단계 | 콜백 / 처리 | 비고 |
---|---|---|
① | SetActive(false) |
GameObject 플래그 변경 |
② | OnDisable() |
모든 활성 MonoBehaviour 에 호출 |
③ | Canvas/Renderer/Collider/Audio 등 네이티브 객체 해제 | 드로우콜·충돌·오디오 믹서에서 제거 |
④ | 상태 저장 후 다음 프레임부터 Update() 중단 |
배치, UI rebuild 모두 제외 |
좀 더 깊게 들어가볼까?
퍼포먼스와 메모리 관점에서