[CH4-17] UI에 플레이어 닉네임 연결하기

김여울·2025년 10월 2일

내일배움캠프

목록 보기
89/139

💥 문제 상황

  • Hidden Victory UI에서 승리자 표시가 "WINNER"로 고정되어 있음

  • 타이틀 화면에서 입력해서 GameInstance에 저장된 실제 플레이어 닉네임이 표시되지 않음

  • 15번 춤췄을 때 히든 승리 조건 달성 시 닉네임이 "PLAYER"로만 표시됨


🔧 해결 과정

1. Client RPC 함수 매개변수 제한사항

// ❌ Client RPC에서는 기본 매개변수 사용 불가
UFUNCTION(Client, Reliable)
void Client_ShowHiddenVictoryUI(TSubclassOf<UUserWidget> WidgetClass, const FString& WinnerNickname = TEXT(""));

// ✅ 기본값 없이 명시적으로 전달해야 함
UFUNCTION(Client, Reliable)  
void Client_ShowHiddenVictoryUI(TSubclassOf<UUserWidget> WidgetClass, const FString& WinnerNickname);

2. 블루프린트 함수 호출 시 크래시 문제

  • FindFunction + ProcessEvent 방식이 불안정함
  • 더 안전한 방법: 직접 위젯 접근
// ✅ GetWidgetFromName으로 직접 Text Block 접근
if (UTextBlock* WinnerTextBlock = Cast<UTextBlock>(HiddenVictoryWidget->GetWidgetFromName(TEXT("WinnerNameText"))))
{
    WinnerTextBlock->SetText(FText::FromString(WinnerNickname));
}

3. GameInstance에서 닉네임 가져오는 올바른 방법

// ❌ 존재하지 않는 함수 호출
FString SavedNickname = GI->GetPlayerNickname();

// ✅ 기존 PostLogin에서 사용하는 함수와 동일하게
FString PlayerId = PS->GetUniqueId().IsValid() ? PS->GetUniqueId()->ToString() : PC->GetName();
FString SavedNickname = GI->GetPlayerNicknameById(PlayerId);

4. 컴파일 오류 해결법

  • LNK1104 오류: 언리얼 에디터가 DLL을 사용 중일 때 발생
  • 해결책: 언리얼 에디터 완전 종료 → Visual Studio에서 빌드 → 재시작

5. 블루프린트 UMG 연결

  • Text Block을 변수로 설정 (Is Variable 체크)
  • 변수명: WinnerNameText
  • Custom Event 대신 직접 C++ 접근이 더 안정적

✅ 최종 동작

GameMode → PlayerController → Client UI 흐름

  1. DCGameMode::DeclareHiddenWinner(): 승리자 닉네임 추출

  2. DCGameMode::ShowHiddenVictoryUI(): 모든 클라이언트에게 전송

  3. DCPlayerController::Client_ShowHiddenVictoryUI_Implementation(): 위젯 생성 및 텍스트 설정

핵심 코드

// DCGameMode.cpp - 닉네임 가져오기
FString PlayerId = PS->GetUniqueId().IsValid() ? PS->GetUniqueId()->ToString() : PC->GetName();
FString WinnerNickname = GI->GetPlayerNicknameById(PlayerId);

// DCPlayerController.cpp - 위젯에 텍스트 설정  
if (UTextBlock* WinnerTextBlock = Cast<UTextBlock>(HiddenVictoryWidget->GetWidgetFromName(TEXT("WinnerNameText"))))
{
    WinnerTextBlock->SetText(FText::FromString(WinnerNickname));
}

💡 기억해라!

  • Client RPC는 기본 매개변수 사용 불가

  • 블루프린트 함수 호출보다 직접 위젯 접근이 안전함

  • 컴파일 오류 시 에디터 완전 종료 후 빌드

  • 기존 코드에서 사용하는 함수명과 일치시켜야 함

  • 멀티플레이어 환경에서는 GameInstance 데이터 활용이 중요

결과적으로 "WINNER" → 실제 플레이어 닉네임으로 성공적으로 변경됨!
타이틀에서 입력한 닉네임이 히든 승리 시 정상적으로 표시됨!

0개의 댓글