Quick Reference
정적 배경은 기존 Canvas에 두고 자주 바뀌거나 수명이 다른 HUD·팝업만 별도 Canvas로 나누되, rebuild 격리와 batch 증가를 함께 고려합니다.
- 기준 버전은 Unity 6.5 (6000.5), Unity UI (UGUI) 2.0.0입니다. 같은 Canvas에서 변경된 UI는 해당 Canvas의 geometry, batching, layout 갱신 범위에 함께 영향을 줍니다.
- 배경과 프레임처럼 거의 변하지 않는 UI는 유지하고, 체력·타이머·알림처럼 자주 바뀌는 덩어리만 별도 Canvas로 분리합니다.
- 별도 Canvas는 rebuild 범위를 격리하지만 batch 경계도 늘립니다. 아이콘 하나마다 분리하지 말고, 갱신 주기와 표시 수명이 다른 덩어리에만 둡니다.
| 지금 보이는 상황 | 먼저 둘 곳 | 이유 |
|---|---|---|
| 프레임, 고정 배경, 로고 | 기존 Static Canvas | 바뀌지 않으면 분리 이득이 없습니다. |
| HP, 탄약, 카운트다운 | Dynamic HUD Canvas | 값 변경이 정적 장식까지 번지는 것을 막습니다. |
| 열고 닫는 메뉴, 확인창 | Popup Canvas | 수명주기와 정렬 순서를 독립적으로 관리합니다. |
| UI 한 요소가 느린 것 같음 | Profiler 확인 후 결정 | Canvas 수를 늘리는 것만으로 병목이 해결되지는 않습니다. |
Canvas와 rebuild 경계
Canvas는 UGUI를 그리는 루트이며, 중첩 Canvas도 독립적인 rebuild와 batching 경계가 됩니다. 그래서 Static HUD, Dynamic HUD, Popup처럼 함께 바뀌는 범위가 다른 UI를 나누는 데 쓸 수 있습니다.
Canvas (Static HUD)
Background
Frame
Canvas (Dynamic HUD)
HpBar
AmmoText
Canvas (Popup)
InventoryPanelDynamic HUD의 숫자가 바뀌어도Static HUD의 배경과 프레임까지 다시 만들 필요가 없게 하는 것이 분리의 목적입니다.- 팝업은 표시 여부와 sorting order가 HUD와 다르므로 별도 Canvas가 자연스럽습니다.
- 반대로 함께 갱신되는 HP 바와 HP 텍스트는 한 Dynamic Canvas에 두는 편이 보통 더 낫습니다. 매 프레임 갱신되는 요소를 각각 Canvas로 쪼개면 batch가 잘게 끊기고 hierarchy 관리만 어려워집니다.
- Profiler에서
Canvas.SendWillRenderCanvases, UI layout/rebuild 비용과 실제 변경 지점을 확인한 뒤 나눕니다. 화면이 복잡해 보인다는 이유만으로 분리하지 않습니다.
Inspector 설정
Render Mode와 카메라
- Render Mode는
Screen Space - Overlay,Screen Space - Camera,World Space중 하나입니다. 새 Canvas의 기본은 Overlay이며, 일반 HUD에 맞습니다. 카메라 깊이와 함께 정렬해야 하면 Screen Space - Camera, 3D 공간의 간판·월드 UI는 World Space를 사용합니다. - Render Camera / Event Camera는 Screen Space - Camera와 World Space에서 화면 크기 계산과 UI 이벤트 광선의 기준이 됩니다. World Space Canvas에서 카메라가 맞지 않으면 클릭 위치와 표시 크기가 예상과 달라질 수 있습니다.
- Plane Distance는 Screen Space - Camera Canvas가 카메라 앞에 놓이는 거리입니다. 다른 카메라 효과나 3D 객체와의 깊이 관계가 필요한 경우에만 조정하며, 가까운 값으로 억지로 앞에 꺼내기보다 camera depth와 sorting을 먼저 확인합니다.
정렬과 픽셀 설정
- Sort Order는 같은 sorting layer 안에서 Canvas가 그려지는 순서입니다. 기본값
0은 같은 layer의 기본 순서이며, 팝업 Canvas를 HUD보다 앞에 둘 때 조정합니다. - Override Sorting은 기본
false이며, 중첩 Canvas가 부모의 sorting을 상속하게 합니다. Popup처럼 자식이 반드시 앞에 와야 할 때만 켜 자신의Sorting Layer와Order in Layer를 쓰게 합니다. 장식용 자식 Canvas에 켜면 화면 순서를 추적하기 어려워집니다. - Pixel Perfect는 Screen Space Canvas에서만 적용됩니다. 픽셀 아트 HUD가 흐려지거나 흔들릴 때 후보가 되지만, 모든 해상도 문제를 해결하지는 않습니다. Canvas Scaler와 anchor가 잘못되었다면 먼저 그쪽을 고칩니다.
- Target Display는 Overlay Canvas가 표시될 디스플레이 인덱스입니다. 멀티 디스플레이 프로젝트에서만 바꾸며, 잘못 고르면 UI가 다른 화면에 나타납니다.
- Additional Shader Channels는 기본
None이며 UI mesh에 Normal, Tangent, TexCoord 같은 추가 정점 데이터를 넣습니다. 해당 데이터를 읽는 UI 셰이더가 있을 때만 켭니다. 필요 없는 채널을 전부 켜 두면 정점 데이터 양만 늘어납니다.
스크립트 연결
Canvas는 Behaviour이므로 enabled로 그 Canvas의 렌더링을 켜고 끌 수 있습니다. 중첩 Canvas의 정렬을 런타임에 제어할 때는 overrideSorting, sortingLayerID, sortingOrder를 함께 봅니다.
using UnityEngine;
public sealed class PopupCanvasLayer : MonoBehaviour
{
[SerializeField] private Canvas popupCanvas;
[SerializeField] private int popupOrder = 100;
public void Show()
{
// 부모 Canvas 아래에 있는 Popup Canvas일 때만 독립 sorting을 켭니다.
popupCanvas.overrideSorting = true;
popupCanvas.sortingOrder = popupOrder;
popupCanvas.enabled = true;
}
public void Hide()
{
popupCanvas.enabled = false;
}
}renderMode를 코드로 바꾸면 카메라와 입력 기준도 바뀔 수 있습니다. 일반적인 화면 전환에는 기존 Canvas의 mode를 매번 바꾸기보다 용도별 Canvas를 미리 정해 둡니다.worldCamera는 Screen Space - Camera와 World Space에서 이벤트와 크기 계산에 쓰입니다. World Space UI를 런타임 생성할 때 카메라를 명시적으로 연결하지 않으면 클릭이 안 되거나 예상과 다른 카메라 기준으로 처리될 수 있습니다.Canvas.ForceUpdateCanvases()는 즉시 최신 layout 결과가 꼭 필요한 특수 상황에만 고려합니다. 평소 갱신을 강제하는 해결책으로 쓰면 UI 비용을 감추기만 합니다.
자주 틀리는 부분
Canvas를 많이 만들수록 항상 빨라지는 것은 아닙니다. 독립 Canvas는 변경 전파를 막는 대신 draw와 sorting 경계를 하나 더 만듭니다. 고정 장식과 매 프레임 값 표시처럼 갱신 성격이 다른 덩어리만 분리하세요.
Popup이 뒤에 깔릴 때 Order in Layer만 먼저 올리지 마세요. 부모 Canvas의 정렬을 상속하는 중첩 Canvas라면 Override Sorting이 꺼져 있을 수 있습니다. 부모 Canvas, override 상태, sorting layer, order를 순서대로 확인해야 합니다.
참고 링크
1 sources