[CommonUI] DataAsset, PrimaryLayout, CommonActivatableWidget

김여울·2025년 11월 24일

내일배움캠프

목록 보기
120/139

DA_LNMap


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

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

WBP_PrimaryLayout


만들었던 Layer에 맞춰서 LayerContainer(Common Activatable Widget Stack) 만들기

컨테이너 이름 (BindWidget)연결될 태그용도 예시
MainLayerContainerUI.Layer.Main메인메뉴, 세팅, 일시정지, etc.
HUDLayerContainerUI.Layer.HUD인게임 HUD
DialogLayerContainerUI.Layer.Dialog확인창, 경고창, 작은 팝업
OverlayLayerContainerUI.Layer.Overlay로딩 화면, 전체 블랙 페이드 등

레이어 태그 1개당 컨테이너 1개 필요


레이어 등록하기

Subsystem
→ ShowWidget(UI_Request.XXX)
→ DataAsset에서 LayerTag 찾음
RootLayout->GetLayerWidget(LayerTag)
→ 해당 컨테이너에 위젯 Push


코드 상에서 위젯 생성시 Suvsystem에 자신을 등록함
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();
		}
	}
}

CommonActivatableWidget

부모 클래스 변경 : (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 MenuUI.Layer.Main
SettingUI.Layer.Main
Pause MenuUI.Layer.Overlay
Confirm Dialog 1/2UI.Layer.Dialog
Loading ScreenUI.Layer.Overlay
HUDUI.Layer.HUD

0개의 댓글