LV_MainMenu → GameMode → HUD 생성
ALNHUD::BeginPlay()
→ RootLayoutClass 확인
→ ULNPrimaryLayout 위젯 생성 + AddToViewport
ULNPrimaryLayout::NativeConstruct()
→ ULNUIManageSubsystem::SetRootLayout(this)
→ ALNHUD::OnRootLayoutReady() 호출
ALNHUD::OnRootLayoutReady()
→ UIManager->ShowWidget(UI.Request.MainMenu)
ULNUIManageSubsystem::ShowWidget()
→ CachedWidgetMap 에서 Policy 찾기
→ LayerTag로 RootLayout->GetLayerWidget()
→ WidgetClass Load → Stack → AddWidget(..)
MainMenu 위젯 화면에 표시
LV_MainMenu 레벨에서 World Settings → GameMode Override에
UI용 GameMode BP 가 들어가 있는지 확인
그 GameMode BP 의 Details → HUD Class 에
→ BP_LNHUD 가 들어가 있는지 확인
ALNHUD::BeginPlay()에 로그 추가하기
UE_LOG(LogTemp, Display, TEXT("ALNHUD: RootLayout 인스턴스 생성 완료"));
✅ Output Log에
BeginPlay()에
if (!RootLayoutClass)
{
UE_LOG(LogTemp, Error,
TEXT("ALNHUD: RootLayoutClass가 설정되지 않았습니다. (BP_LNHUD에서 설정 필요"));
return;
}
✅ Output Log에 이 에러 보이면
RootLayoutClass에ULNPrimaryLayout::NativeConstruct() 에
if (UGameInstance* GI = GetGameInstance())
{
if (ULNUIManageSubsystem* UISubsystem = GI->GetSubsystem<ULNUIManageSubsystem>())
{
UISubsystem->SetRootLayout(this);
}
}
// 그리고 그 뒤에 HUD->OnRootLayoutReady() 호출
UE_LOG(LogTemp, Log, TEXT("LNPrimaryLayout: NativeConstruct 실행됨")); // 추가
✅ Output Log에
WBP_PrimaryLayout의 부모 클래스가 ULNPrimaryLayout 이 맞는지,UserWidget이면 NativeConstruct 오버라이드 안 불림)NativeConstruct() 에서 HUD 찾은 뒤:
if (APlayerController* PC = GetOwningPlayer())
{
if (ALNHUD* HUD = PC->GetHUD<ALNHUD>())
{
UE_LOG(LogTemp, Log, TEXT("LNPrimaryLayout: HUD 찾음, OnRootLayoutReady 호출"));
HUD->OnRootLayoutReady();
}
}
그리고 ALNHUD::OnRootLayoutReady() 처음 줄에:
UE_LOG(LogTemp, Log, TEXT("ALNHUD: OnRootLayoutReady 호출됨"));
✅ Output Log에
GetHUD<ALNHUD>() 가 null 이거나 HUDClass 가 다른 클래스로 세팅돼 있을 가능성 (추측)ULNUIManageSubsystem::Initialize() 에
UE_LOG(LogTemp, Log,
TEXT("UIManageSubsystem: %d개의 UI 정책(UI 맵) 로드됨."),
CachedWidgetMap.Num());
그리고 Config 경로가 잘못됐을 때:
UE_LOG(LogTemp, Error,
TEXT("UIManageSubsystem: UIMapDataAssetPath is invalid. DefaultGame.ini 설정 확인 필요"));
✅ Output Log에 UIManageSubsystem 필터로 확인
DefaultGame.ini 에[/Script/OurLongNight.LNUIManageSubsystem]LNMapDataAssetPath="/Game/경로/DA_LNMap.DA_LNMap"0개의 UI 정책 이라고 나오면WidgetMap이 비어있다는 뜻 (DA에 MainMenu 항목이 없는 것)ShowWidget 안에 이미 Warning 로그들 있음
Output Log에서 ShowWidget 으로 검색하기
정확히 어느 단계에서 null 이 나오는지
흔한 경우:
WidgetMap 에UI.Request.MainMenuWidgetClass = WBP_MainMenu (부모: UCommonActivatableWidget)TargetLayer = UI.Layer.MainWBP_PrimaryLayout 안에서 레이어 등록(RegisterLayer) 이 안 되어 있는 경우GetLayerWidget 이 null 반환 → “레이어 스택 없음” 로그✅ Output Log 열고 검색어 순서대로 보기:
ALNHUD: RootLayout 인스턴스 생성LNPrimaryLayout: NativeConstructALNHUD: OnRootLayoutReadyUIManageSubsystemShowWidget
UIMapDataAssetPath 가 Config에서 제대로 안 들어와서IsValid() 가 실패함CachedWidgetMap 도 비어 있음RootLayout 인스턴스 생성 완료)RootLayout 등록 완료)ShowWidget(UI.Request.ShowHUD) 를 호출했지만CachedWidgetMap.Find(RequestTag) 에서 아무것도 못 찾음 → UI Policy에 등록된 태그가 없음 경고DefaultGame.ini – LNMapDataAssetPath 고치기
LNMapDataAsset 안에 UI.Request.ShowHUD 항목이 비어 있거나 아예 없음
→ DA_LNMapDataAsset 안에 HUD 태그 매핑 추가
RootLayout(PrimaryLayout)에 Layer가 등록
DA_LNMapDataAsset 의 조건이 정확히
MainMenu 띄우려면 DA가 이렇게 돼 있어야 한다:
| Key | WidgetClass | Layer |
|---|---|---|
| UI.Request.MainMenu | WBP_MainMenu | UI.Layer.Main |
MainMenu 맵에서는 MainMenu만 띄우면 됨
5. HUD 쪽 로직이 MainMenu를 안 띄우고 HUD 를 띄우고 있는지 확인 ⭐
기존 코드
if (CurrentLevelName.Contains("Frontend"))
{
UIManager->ShowWidget(FGameplayTag::RequestGameplayTag(TEXT("UI.Request.MainMenu")));
}
else
{
UIManager->ShowWidget(FGameplayTag::RequestGameplayTag(TEXT("UI.Request.ShowHUD")));
}
지금 LV_MainMenu 레벨 이름이 Frontend를 포함함?
→ 레벨 이름이 LV_MainMenu 라서 Frontend 라는 글자가 없어서 ShowHUD 를 띄우려고 하고 있음
그러면 HUD는 없어 → MainMenu도 안 뜸 → 아무것도 안 뜸
// 방법 1 - 레벨 이름 체크 변경
if (CurrentLevelName.Contains("MainMenu"))
// 방법 2 - 그냥 무조건 MainMenu 띄우기
UIManager->ShowWidget(FGameplayTag::RequestGameplayTag(TEXT("UI.Request.MainMenu")));
// ⭐ 방법 3 - Tag 사용하기 ⭐
UIManager->ShowWidget(LNGameplayTags::UI_Request_MainMenu);
다 하고 라이더 껐다 다시 열면 됨!!!
그치만 위젯 위치가 너무 구리다...
