

블루프린트 부모를 만들어놨던 C++클래스(LNMapDataAsset)로 변경하기

TMap<FGameplayTag, FUIWidgetPolicy> WidgetMap; 에 맞춰서 Request-Layer 짝 맞추기

만들었던 Layer에 맞춰서 LayerContainer(Common Activatable Widget Stack) 만들기
| 컨테이너 이름 (BindWidget) | 연결될 태그 | 용도 예시 |
|---|---|---|
MainLayerContainer | UI.Layer.Main | 메인메뉴, 세팅, 일시정지, etc. |
HUDLayerContainer | UI.Layer.HUD | 인게임 HUD |
DialogLayerContainer | UI.Layer.Dialog | 확인창, 경고창, 작은 팝업 |
OverlayLayerContainer | UI.Layer.Overlay | 로딩 화면, 전체 블랙 페이드 등 |
→ 레이어 태그 1개당 컨테이너 1개 필요

레이어 등록하기
Subsystem
→ ShowWidget(UI_Request.XXX)
→ DataAsset에서 LayerTag 찾음
→RootLayout->GetLayerWidget(LayerTag)
→ 해당 컨테이너에 위젯 Push
void ULNPrimaryLayout::NativeConstruct()
{
Super::NativeConstruct();
// GameInstance에서 UIManageSubsystem 찾아서 자신을 RootLayout으로 등록
if (UGameInstance* GI = GetGameInstance())
{
if (ULNUIManageSubsystem* UISubsystem = GI->GetSubsystem<ULNUIManageSubsystem>())
{
UISubsystem->SetRootLayout(this);
}
}
// RootLayout이 Construct 되자마자 HUD에게 알려줌
if (APlayerController* PC = GetOwningPlayer())
{
if (ALNHUD* HUD = PC->GetHUD<ALNHUD>())
{
HUD->OnRootLayoutReady();
}
}
}
부모 클래스 변경 : (Common) UserWidget → CommonActivatableWidget
화면 전체를 한 장으로 띄우는 UI (메인메뉴, 설정창, 인게인 HUD 등)만 부모 변경
→ 독립적인 전체 화면(스크린) UI들이 레이어 스택에 Push/Pop 되는 단위
버튼, 텍스트, 리스트, 슬라이더 같은 내부 구성 UI들은 부모 변경할 필요 없음
→ UUserWidger 또는 UCommonUserWidget 그대로 써도 됨
→ 스스로 화면에 Push 되지도 않고, 레이어에 올라가는 컨테이너도 아님
| 화면 이름 | Activatable 필요? | 이유 |
|---|---|---|
| MainMenu | 필요 | 화면 단위 UI |
| SettingMenu | 필요 | 화면 전환/Push 대상 |
| PauseMenu | 필요 | 레이어에 뜸 |
| ConfirmDialog | 필요 | Dialog 레이어 사용 |
| LoadingScreen | 필요 | Overlay 레이어 사용 |
| HUD | 필요 | In-game 메인 UI |
| WB_MenuButton | 필요 없음 | 버튼은 화면 단위가 아님 |
| WB_Slider | 필요 없음 | 위젯 내부 구성요소 |
| 리스트 아이템 | 필요 없음 | 레이아웃 내부에서만 사용 |
| UI 화면 | Layer |
|---|---|
| Main Menu | UI.Layer.Main |
| Setting | UI.Layer.Main |
| Pause Menu | UI.Layer.Overlay |
| Confirm Dialog 1/2 | UI.Layer.Dialog |
| Loading Screen | UI.Layer.Overlay |
| HUD | UI.Layer.HUD |