Layer 0 → 가장 밑 (기본 HUD)
Layer 1 → 메뉴 / 인벤토리 등
Layer 2 → 팝업 / 대화창 / 알림 등
Style Asset 으로 분리메뉴에서 B = 닫기
인벤토리에서 B = 뒤로가기
전투 중에는 무시
언리얼 엔진의 일반범용 UI 퀵스타트 가이드 | 언리얼 엔진 5.5 문서 | Epic Developer Community
UI 상태를 이름표처럼 계층적으로 관리
| 예시 | 설명 |
|---|---|
UI.MainMenu | 메인 메뉴 전체 |
UI.MainMenu.Main | 메인 메뉴의 홈화면 버튼 |
UI.Inventory.Equipment | 인벤토리 중 장비 탭 |
UI.MainMenu → UI.MainMenu.Main)
게임 중 어디서든 UI 호출이 가능해야 하므로 독립된 관리가 필요하다

Active Tag 여러 개 만들어서 Layer처럼 사용해서 각 Layer 마다 Z Order 관리 쉬움




+GameplayTagList=(Tag="UI.MainMenu.Graphic",DevComment="MainMenu에서 Graphic 설정하는 거예요.")
+GameplayTagList=(Tag="UI.MainMenu.Main",DevComment="이거는 MainMenu 입니다.")
+GameplayTagList=(Tag="UI.MainMenu.Audio",DevComment="이거는 MainMenu에서 소리 설정하는 겁니다.")

UITag.h
#pragma once
#include "NativeGameplayTags.h"
// 이벤트 채널용 네이티브 태그(오타 방지/자동완성)
namespace UI_EVENT_TAG
{
UE_DECLARE_GAMEPLAY_TAG_EXTERN(OpenPauseMenu);
UE_DECLARE_GAMEPLAY_TAG_EXTERN(ClosePauseMenu);
UE_DECLARE_GAMEPLAY_TAG_EXTERN(OpenInventory);
UE_DECLARE_GAMEPLAY_TAG_EXTERN(CloseInventory);
UE_DECLARE_GAMEPLAY_TAG_EXTERN(ShowToast);
}
UITag.cpp
#include "UITag.h"
UE_DEFINE_GAMEPLAY_TAG(UI_EVENT_TAG::OpenPauseMenu, "UI.Event.OpenPauseMenu");
UE_DEFINE_GAMEPLAY_TAG(UI_EVENT_TAG::ClosePauseMenu, "UI.Event.ClosePauseMenu");
UE_DEFINE_GAMEPLAY_TAG(UI_EVENT_TAG::OpenInventory, "UI.Event.OpenInventory");
UE_DEFINE_GAMEPLAY_TAG(UI_EVENT_TAG::CloseInventory, "UI.Event.CloseInventory");
UE_DEFINE_GAMEPLAY_TAG(UI_EVENT_TAG::ShowToast, "UI.Event.ShowToast");
UI는 클라이언트 전용
→ 서버에서 복제되지 않음. 클라이언트에서만 복제!
→ 점수 같은 건 서버에서 전달 필요함
UI Subsystem으로 통합 관리
→ 인벤토리 위젯 직접 띄우기 대신 ActiveTag 등록 → 자동으로 띄움
ActiveTag 시스템으로 상태 추적
→ 어떤 UI가 켜져있는지, 어느 Layer에 위치하는지 명확함
Layer별 ZOrder 제어
→ 레이어 간 우선 순위 문제 해결
[ SERVER ]
├─ GameMode (서버 전용)
├─ GameState → 클라 복제
├─ PlayerController (모든 유저별 존재)
├─ PlayerState → 클라 복제
[ CLIENT (자기 자신) ]
├─ PlayerController (자기 것만)
├─ PlayerState (모든 유저의 상태 복제)
├─ GameState (서버에서 받은 공용 정보)
├─ HUD (로컬 생성)
├─ Widget (로컬 생성)
| 구분 | 서버에서만 | 서버→클라 복제 | 클라 전용 |
|---|---|---|---|
| 서버 전용 | GameMode | ||
| 서버→클라 복제 | GameState, PlayerState | ||
| 개인 클라 전용 | PlayerController(로컬), HUD, Widget |
GameMode → GameState → PlayerState
데이터만 복제되는 구조
GameMode 는 서버의 로직 담당
GameState 가 클라에 공유할 데이터 컨테이너
PlayerController → HUD / Widget
UI는 항상 클라 로컬에서만 생성하고 갱신
UI에 서버 정보 표시하고 싶으면 GamesState나 PlayerState의 Replicated 변수를 Bind해서 가져옴