Quick Reference
페이드와 입력 차단은 CanvasGroup, 스크립트까지 멈추는 완전한 숨김은 SetActive(false), 렌더링만 끄려면 Canvas.enabled를 사용합니다.
- 기준 버전은 Unity 6.5 (6000.5), Unity UI (UGUI) 2.0.0입니다. 화면에서 안 보임, 입력을 안 받음, 오브젝트가 비활성임은 서로 다른 상태입니다.
- 페이드하는 팝업은
CanvasGroup.alpha,interactable,blocksRaycasts를 함께 바꿉니다. - 패널의 MonoBehaviour와 하위 오브젝트까지 멈춰야 하면
GameObject.SetActive(false)를 씁니다. - 렌더링만 끄되 GameObject와 스크립트 수명주기는 유지하려면
Canvas.enabled를 씁니다. 페이드 중에는 끄지 않습니다.
Inspector 설정
CanvasGroup은 자신과 자식 UI의 표시와 UI raycast 처리를 묶어 제어합니다. 하위 Group이 여러 개면 alpha와 입력 조건이 계층을 따라 합쳐지므로, 상위 Group 하나의 값만 보고 판단하면 안 됩니다.
- Alpha의 기본은
1이며 값 범위는0에서1입니다. 자식 Graphic의 alpha와, 중첩 CanvasGroup의 alpha가 곱해집니다.0은 보이지 않게 할 뿐Update를 멈추거나SetActive(false)가 되게 하지는 않습니다. - Interactable의 기본은 켜짐입니다. Button, Toggle, Slider처럼 Selectable을 사용하는 자식이 상호작용 가능한지 정합니다.
false로 하면 자식 버튼이 회색 상태와 비슷한 비활성 규칙을 따르지만,blocksRaycasts를 대신하지는 않습니다. - Blocks Raycasts의 기본은 켜짐입니다. 이 Group 아래 Graphic이 GraphicRaycaster 입력 후보를 막을 수 있는지 정합니다. 숨긴 패널은 보통
false로 같이 바꿔 투명 blocker를 없앱니다. - Ignore Parent Groups의 기본은 꺼짐입니다. 이 Group이 상위 CanvasGroup의 규칙을 무시하게 합니다. 부모 팝업을 흐리게 해도 자식 도움말만 독립적으로 유지해야 하는 제한적인 경우에만 씁니다. alpha 0인 부모 안에서 자식을 예외로 보이게 하려면 별도 Canvas가 필요한 경우가 있으므로, 단순한 페이드 해결책으로 켜지 않습니다.
| 목적 | 권장 방식 | 같이 확인할 값 |
|---|---|---|
| 팝업을 페이드하며 입력도 차단 | CanvasGroup | alpha, interactable, blocksRaycasts |
| 메뉴를 완전히 닫고 스크립트도 멈춤 | SetActive(false) | OnDisable/OnEnable 재진입 |
| 화면에만 그리지 않음 | Canvas.enabled = false | 자식 GameObject는 여전히 active |
| 부모 상태와 독립한 하위 UI | 별도 Canvas 우선 검토 | ignoreParentGroups는 예외 처리 |
스크립트 연결
표시 상태를 한 메서드에 모으면 alpha만 바꾸고 입력을 남기는 실수를 막을 수 있습니다. CanvasGroup은 이벤트 함수가 아니라 필드 값을 바꾸는 컴포넌트이므로, 애니메이션과 함께 써도 최종 입력 상태를 명시적으로 맞춥니다.
using UnityEngine;
public sealed class ModalVisibility : MonoBehaviour
{
[SerializeField] private CanvasGroup group;
[SerializeField] private Canvas canvas;
public void SetVisible(bool visible)
{
group.alpha = visible ? 1f : 0f;
group.interactable = visible;
group.blocksRaycasts = visible;
}
public void DisableRendering()
{
canvas.enabled = false;
}
}// 완전 종료가 필요한 메뉴라면, 페이드가 끝난 시점에 호출합니다.
gameObject.SetActive(false);SetActive(false)는 해당 GameObject와 자식의 active 상태를 끕니다. 활성화된 MonoBehaviour에는OnDisable이 호출되고, 다시 켤 때OnEnable이 다시 들어올 수 있습니다. 구독 해제·재구독을 이 흐름에 맞춰 작성합니다.Canvas.enabled는 Canvas 컴포넌트의 렌더링을 끄는 선택입니다. 자식 GameObject를 inactive로 만들지 않으므로, 패널 수명주기를 끝내려는 의도라면 대체재가 아닙니다.CanvasGroup.IsRaycastLocationValid는 GraphicRaycaster가 내부적으로 raycast 허용 여부를 판단할 때 쓰는ICanvasRaycastFilter구현입니다. 보통 직접 호출하지 않고blocksRaycasts를 설정합니다.
자주 틀리는 부분
alpha만 0으로 두면 투명한 UI가 남습니다. 특히 full-screen 패널은 보이지 않아도 버튼을 가로막습니다. 숨길 때 blocksRaycasts = false를 함께 적용하세요.
자주 여닫는 패널이라고 무조건 SetActive를 피할 필요는 없습니다. 매번 OnEnable에서 무거운 목록 생성·서버 요청·구독을 다시 한다면 그 비용이 문제입니다. 실제 수명주기가 끝난 패널에는 SetActive가 더 명확할 수 있고, 페이드 전환이 필요한 패널에는 CanvasGroup이 맞습니다.
참고 링크
2 sources