[2025_10_30]Unity UI관리 기법
2025. 10. 30. 21:17ㆍTIL
1. 개요
Unity에서 Scene UI와 Popup UI를 분리하여 관리하는 UIManager 시스템을 구현했다.
2. 핵심 개념
1. UI 타입 분류
csharp
public enum UIType
{
Scene, // 일반 화면 UI (한 번에 하나만)
Popup // 팝업 UI (여러 개 가능, 최상단 표시)
}
2. UI 추상 클래스 구조
각 UI 요소가 반드시 구현해야 할 메서드들을 정의:
- Init() - 패널 초기 설정
- Show() - 패널 열기
- Close() - 패널 닫기
- OnShow() - 열렷을 때 실행 할 메서드
- OnClose() - 닫혔을 때 실행 할 메서드
- 이벤트 구독/해제 메서드
csharp
public abstract class UIBase : MonoBehaviour
{
public UIType UIType;
public abstract void Init();
public abstract void Show();
public abstract void Close();
}
UIManager 구조
Canvas 구성
```
ManagerRoot
└── UIManager
├── SceneCanvas (Sort Order: 0)
└── PopupCanvas (Sort Order: 100) ← 항상 최상단
3. 주요 기능
1. 프리팹 등록 및 생성
csharp
[SerializeField] private List<UIBase> uiPrefabLists;
private Dictionary<string, UIBase> uiPanels;
- Inspector에서 UI 프리팹들을 리스트로 등록
- Awake 시 자동으로 Instantiate하여 Dictionary에 저장
- UIType에 따라 적절한 Canvas에 배치
2. Scene UI 관리
csharp
private UIBase currentPanel; // 현재 활성화된 Scene UI 추적
public void ShowPanel<T>() where T : UIBase
{
if (panel.UIType == UIType.Scene)
{
// 이전 Scene UI가 있다면 닫기
if (currentPanel != null && currentPanel != panel)
{
currentPanel.Close();
}
currentPanel = panel;
}
}
- Scene UI는 한 번에 하나만 활성화
- 새로운 Scene UI를 열면 이전 것은 자동으로 닫힘
3. 제네릭 기반 패널 접근
csharp
public T GetPanel<T>() where T : UIBase
public void ShowPanel<T>() where T : UIBase
public void ClosePanel<T>() where T : UIBase
public bool IsShowing<T>() where T : UIBase
사용 예시:
csharp
UIManager.ShowPanel<StageClearUI>();
UIManager.ClosePanel<StageClearUI>();
bool isOpen = UIManager.IsShowing<StageClearUI>();
4. 핵심 로직
초기화 흐름
csharp
private void Awake()
{
InstantiatePrefabs(); // 1. 프리팹 생성 및 Canvas 배치
InitPanels(); // 2. 모든 패널 초기화 및 비활성화
}
Canvas 선택 로직
csharp
private Canvas GetTargetCanvas(UIType uiType)
{
switch (uiType)
{
case UIType.Scene:
return sceneCanvas;
case UIType.Popup:
return popupCanvas; // Sort Order 100으로 최상단 보장
default:
return sceneCanvas;
}
}
5. 장점
- 타입 안정성: 제네릭을 사용해 컴파일 타임에 타입 체크
- 자동 관리: Scene UI는 자동으로 하나만 활성화되도록 관리
- 레이어 분리: Popup은 항상 Scene UI 위에 표시
- 확장성: 새로운 UI는 UIBase를 상속받아 쉽게 추가 가능
- 캡슐화: Dictionary로 내부 관리, 외부에서는 제네릭 API만 사용
6. 사용 시 주의사항
- UI 프리팹은 반드시 UIBase를 상속받은 컴포넌트가 있어야 함
- PopupCanvas의 Sort Order는 100으로 설정하여 최상단 보장
- Scene UI 열 때는 이전 Scene UI가 자동으로 닫히므로 상태 저장 필요 시 Close() 메서드에서 처리
7. 개선 가능한 점
- UI 전환 애니메이션 추가
UI파트를 맡은 김에 새로운 UI관리를 공부하며 도전해 보았다.
'TIL' 카테고리의 다른 글
| [2025_11_03]EventBus (0) | 2025.11.03 |
|---|---|
| [2025_10_31]Unity로딩(코루틴과 async/await방식) (0) | 2025.10.31 |
| [2025_10_29]오늘 배운것.. 회의... 새프로젝트 기획 (0) | 2025.10.29 |
| [2025_10_28]메타버스_미니게임 마무리 (1) | 2025.10.28 |
| [2025_10_27]다양한 미니게임이 있는 메타버스만들기-3(AnimatorOverrideController,RuntimeAnimatorController) (0) | 2025.10.27 |