Unity에서 오브젝트를 화면에서 숨기려 할 때 가장 먼저 떠오르는 방법은 gameObject.SetActive(false) 일 것입니다. 하지만 이 방식에는 생각보다 무거운 작업이 숨어 있습니다.
// 가장 일반적인 방법
gameObject.SetActive(false);
SetActive( false )
SetActive(false) 는 단순히 보이지 않게 하는 것이 아니라, 해당 GameObject와 그 모든 자식 오브젝트들까지 재귀적으로 비활성화합니다. 이 과정에서 OnDisable() 이벤트가 호출되고, 오브젝트는 렌더링뿐 아니라 물리, 업데이트 루프 등 모든 시스템에서 제외됩니다.
이처럼 SetActive()는 꽤 많은 비용이 수반되므로, 한두 번 정도 사용하는 것은 괜찮지만, 짧은 시간 간격으로 자주 호출되면 성능 문제가 발생할 수 있습니다. 예를 들어 초당 수십 번씩 오브젝트를 껐다 켜는 상황이라면, 프레임 드랍이나 GC 발생 같은 현상이 나타날 수 있습니다.
단순히 화면에서 보이지 않게 하는 것이 목적이라면
이럴 때 고려할 수 있는 더 가벼운 대안은 MeshRenderer.enabled = false 입니다. 이 방식은 렌더링만 비활성화하기 때문에, 오브젝트는 여전히 존재하고 충돌이나 스크립트 동작도 유지됩니다. 하지만 화면에는 보이지 않게 됩니다.
// 렌더링만 끄는 방법
GetComponent<MeshRenderer>().enabled = false;
MeshRenderer.enabled는 SetActive처럼 자식 오브젝트에 영향을 주지 않고, 별도의 이벤트 호출도 없으므로 성능 비용이 거의 없습니다. 따라서 자주 숨기고 보이게 해야 하는 오브젝트에는 훨씬 적합한 방식입니다.
요약
• 전체 기능을 완전히 끄고 싶을 때 : SetActive(false)
• 렌더링만 끄고 기능은 유지하고 싶을 때: renderer.enabled = false
이렇게 구분해서 사용하는 것이 최적화에 큰 도움이 됩니다.
특히 초당 빈번한 활성화 / 비활성화가 필요한 경우, SetActive()는 피하고 renderer.enabled 방식으로 접근하는 것이 더 안전합니다.
'Unity' 카테고리의 다른 글
로그를 찍을 때, 시간도 같이 남기는 방법 (0) | 2025.06.16 |
---|---|
유니티 시네머신 3.x : 추적 카메라 설정 방법 (0) | 2025.05.28 |
유니티에서 FBX 파일 가져왔는데 텍스처가 안 보일 때 (0) | 2025.05.10 |
Unity 에서 Empty object 를 Scene 창에서 보이게 하는 방법 (0) | 2025.04.30 |
코루틴의 한계 : 일시 정지가 불가능한 구조 (0) | 2025.04.27 |