[CommonUI] 로비 → 더미 위젯 시스템

김여울·2025년 12월 24일

내일배움캠프

목록 보기
135/139

문제

🎮 호스트: Dummy 위젯 잘 뜸
❌ 클라이언트: Dummy 위젯 안 뜸

해결 (실패 → 성공)

1단계: RPC 호출 누락 → Server RPC 추가 ❌

초기: StartGameWhenAllReady()에서 바로 UI 띄움
문제: 서버에서만 실행 → 클라이언트 미수신
해결: Server_StartGameOnAllPlayers() RPC 추가

2단계: GameMode Multicast → 클라이언트 복제 불가 ❌

GameMode.Server_StartGameOnAllPlayers()
    ↓ Multicast (서버만)
    ❌ GameMode는 클라이언트에 복제 안됨!

3단계: PlayerState Multicast → 불안정 ❌

GameMode → PlayerState.MulticastShowDummyWidgetForAll()
    ↓ 모든 클라이언트에 복제
    ❌ UI 권한 문제 + 복잡

4단계: PlayerController Multicast → 완벽 성공 ✅

GameMode.Server_StartGameOnAllPlayers()
    ↓ 각 PlayerController에 RPC
ALNControllerInGame.Multicast_ShowDummyWidgetForAll()
    ↓ 각 클라이언트 로컬 UI
✅ 각 클라이언트에서 직접 UI 띄움!

최종 구조

// 1. GameMode 서버에서 호출 (StartGameWhenAllReady)
Server_StartGameOnAllPlayers();

// 2. Server RPC (서버에서만 실행)
void ALNGameModeInGame::Server_StartGameOnAllPlayers_Implementation()
{
    for (APlayerState* PS : GS->PlayerArray)
    {
        if (ALNControllerInGame* PC = Cast<ALNControllerInGame>(LNPS->GetPlayerController()))
        {
            PC->Multicast_ShowDummyWidgetForAll();  // 각 PC에 RPC
        }
    }
}

// 3. 각 클라이언트 PlayerController에서 로컬 UI
void ALNControllerInGame::Multicast_ShowDummyWidgetForAll_Implementation()
{
    UISubsystem->ShowWidget(DummyTag);  // 로컬 클라이언트 UI!
}

파일변경내용
LNControllerInGame.hUFUNCTION(NetMulticast, Reliable) void Multicast_ShowDummyWidgetForAll(); 추가
LNControllerInGame.cppMulticast_ShowDummyWidgetForAll_Implementation() 구현
LNGameModeInGame.cppServer_StartGameOnAllPlayers_Implementation() 내 LNPS-> → PC-> 변경
LNPlayerState.h/cppMulticastShowDummyWidgetForAll() 삭제 (선택)

로그 확인

[GameMode] StartGameWhenAllReady - CALLING Multicast_ShowDummyWidgetForAll
Controller Show DummyWidget - BPLNControllerInGameC2147481411  ✅ 호스트
Controller Show DummyWidget - BPLNControllerInGameC2147482092  ✅ 클라이언트

클래스서버클라이언트UI 제어
GameMode❌ 없음
GameState✅ 복제⚠️ 불안정
PlayerState✅ 복제⚠️ 권한문제
PlayerController✅ 개별 존재✅ 로컬 완벽

💡 정석:
서버(GameMode) → RPC → PlayerController(각 클라이언트) → 로컬 UI

패키징 테스트

🎄🎅🏻

1️⃣ 처음 튜토리얼 레벨로 가면 LobbyWidget 호출 (Host)

2️⃣ 클라이언트 전원 Ready 클릭

🎄🎅🏻

3️⃣ 호스트의 Start 활성화

4️⃣ 호스트 Start 클릭

🎄🎅🏻

5️⃣ 호스트와 클라이언트 모두 DummyWidget으로 변경

🎄🎅🏻

6️⃣ Stage1으로 트래블 되어도 DummyWidget 그대로 유지

NetMulticast RPC = 서버에서 호출 → 모든 클라이언트 실행
PlayerController = 각 클라이언트에 개별 존재 → 로컬 UI 완벽 제어

이제 모든 멀티플레이 UI는 PlayerController로!

0개의 댓글