핵심 정리
csharp
canvasGroup.alpha = visible ? 1f : 0f;
canvasGroup.interactable = visible;
canvasGroup.blocksRaycasts = visible;구조 이해
- "안 보인다"와 "업데이트하지 않는다"와 "입력을 받지 않는다"는 같은 말이 아닙니다. Unity UI에서 숨김 전략을 고를 때 이 셋을 분리해서 보는 것이 중요합니다.
SetActive(false)는 GameObject 전체를 비활성화합니다. 하위 오브젝트의OnDisable이 호출되고, hierarchy에서 빠지듯 동작하므로 가장 분명하지만 재활성 시 초기화 비용과 lifecycle 재진입을 고려해야 합니다.CanvasGroup은 시각적 표시 여부와 입력 여부를 함께 제어하기 좋습니다. 페이드, modal popup, 임시 비활성 같은 연출성 UI에서 특히 유용합니다.- alpha만 0으로 만드는 것은 화면에서만 안 보이게 할 뿐, 입력과 갱신을 그대로 남길 수 있습니다. 그래서 "안 보이는데 클릭이 막힌다"는 버그의 흔한 원인입니다.
Canvas.enabled = false는 렌더링 관점에서 끄는 선택지이지만, GameObject 자체를 끄는 것과는 수명주기 의미가 다릅니다. 그래서 팀 규칙 없이 섞어 쓰면 동작이 헷갈리기 쉽습니다.
체크포인트
| 상황 | 적합한 선택 |
|---|---|
| 페이드 전환, 팝업 표시/입력 동시 제어 | CanvasGroup (alpha + blocksRaycasts) |
| UI 전체를 닫고 lifecycle도 멈추고 싶을 때 | SetActive(false) |
| 렌더링만 끄고 lifecycle은 유지 | Canvas.enabled = false |
| alpha만 0으로 → 투명하게만 보이게 | 단독 사용 신중 (입력은 그대로 받음) |
| 자주 켜고 끄는 큰 패널 묶음 | SetActive 남발보다 Canvas 분리 + CanvasGroup 검토 |
주의할 점
alpha만 0으로 두고 blocksRaycasts를 끄지 않으면 보이지 않는 UI가 클릭을 가로막고, 큰 패널을 매번 SetActive로 토글하면 재초기화 비용이 커질 수 있습니다.
csharp
// ❌ alpha만 0으로 — 화면에 안 보이지만 클릭 차단
canvasGroup.alpha = 0f;
// 결과: 투명한 패널이 버튼 클릭을 가로막음
// ✅ 숨길 때 입력도 함께 차단
canvasGroup.alpha = 0f;
canvasGroup.interactable = false;
canvasGroup.blocksRaycasts = false;
// ✅ SetActive(false) — 완전 비활성, OnDisable 호출됨
gameObject.SetActive(false);
// 단, 자주 토글하면 OnEnable/OnDisable 초기화 비용 누적
// ✅ Canvas.enabled — 렌더링만 끔, 오브젝트 상태 유지
canvas.enabled = false;참고 링크
2 sources