기본 패턴
csharp
gameObject.SetActive(false);
renderer.enabled = false;
bool self = gameObject.activeSelf;
bool active = gameObject.activeInHierarchy;설명
SetActive(false)는 GameObject 전체를 비활성화합니다. 그 오브젝트와 자식 오브젝트의 컴포넌트 업데이트, 렌더링, 충돌 참여가 함께 멈추는 쪽에 가깝습니다.enabled = false는 특정Behaviour나Renderer같은 컴포넌트만 끄는 방식입니다. 오브젝트 자체는 살아 있고, 다른 컴포넌트는 계속 동작할 수 있습니다.activeSelf는 "이 오브젝트 자신이 켜져 있는가"를,activeInHierarchy는 "부모 포함 실제 계층 기준으로 지금 활성인가"를 보여 줍니다.- 그래서 부모가 꺼져 있으면 자식의
activeSelf는true여도activeInHierarchy는false일 수 있습니다. 이 차이를 모르고 디버깅하면 왜 안 보이고 왜 안 도는지 헷갈리기 쉽습니다. SetActive는OnEnable/OnDisable같은 라이프사이클에도 직접 영향을 주므로, 단순 렌더링 on/off와는 다른 강한 도구라고 생각하는 편이 좋습니다.
빠른 정리
| 항목 | 의미 |
|---|---|
SetActive(false) | GameObject 전체 비활성화 |
enabled = false | 특정 컴포넌트만 비활성화 |
activeSelf | 자기 자신의 활성 플래그 |
activeInHierarchy | 부모 포함 실제 활성 상태 |
| 라이프사이클 영향 | SetActive는 OnEnable/OnDisable에 영향 |
주의할 점
"안 보이게만 하고 싶다"와 "아예 동작하지 않게 하고 싶다"는 다른 문제입니다.
단순 표시만 끌 건지, 입력/업데이트/자식까지 함께 멈출 건지 먼저 정한 뒤 enabled와 SetActive를 고르는 편이 좋습니다.
참고 링크
4 sources