🎮 호스트: Dummy 위젯 잘 뜸
❌ 클라이언트: Dummy 위젯 안 뜸
초기: StartGameWhenAllReady()에서 바로 UI 띄움
문제: 서버에서만 실행 → 클라이언트 미수신
해결: Server_StartGameOnAllPlayers() RPC 추가
GameMode.Server_StartGameOnAllPlayers()
↓ Multicast (서버만)
❌ GameMode는 클라이언트에 복제 안됨!
GameMode → PlayerState.MulticastShowDummyWidgetForAll()
↓ 모든 클라이언트에 복제
❌ UI 권한 문제 + 복잡
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.h | UFUNCTION(NetMulticast, Reliable) void Multicast_ShowDummyWidgetForAll(); 추가 |
| LNControllerInGame.cpp | Multicast_ShowDummyWidgetForAll_Implementation() 구현 |
| LNGameModeInGame.cpp | Server_StartGameOnAllPlayers_Implementation() 내 LNPS-> → PC-> 변경 |
| LNPlayerState.h/cpp | MulticastShowDummyWidgetForAll() 삭제 (선택) |
[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로!