[2025_10_30]Unity UI관리 기법

2025. 10. 30. 21:17TIL

 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. 장점

  1. 타입 안정성: 제네릭을 사용해 컴파일 타임에 타입 체크
  2. 자동 관리: Scene UI는 자동으로 하나만 활성화되도록 관리
  3. 레이어 분리: Popup은 항상 Scene UI 위에 표시
  4. 확장성: 새로운 UI는 UIBase를 상속받아 쉽게 추가 가능
  5. 캡슐화: Dictionary로 내부 관리, 외부에서는 제네릭 API만 사용

6. 사용 시 주의사항

  • UI 프리팹은 반드시 UIBase를 상속받은 컴포넌트가 있어야 함
  • PopupCanvas의 Sort Order는 100으로 설정하여 최상단 보장
  • Scene UI 열 때는 이전 Scene UI가 자동으로 닫히므로 상태 저장 필요 시 Close() 메서드에서 처리

7.  개선 가능한 점

  • UI 전환 애니메이션 추가

 

UI파트를 맡은 김에 새로운 UI관리를 공부하며 도전해 보았다.