LobbyMaps에서 인원을 채우고 Start를 눌러 DemoMaps로 이동하면 Tagger/Hider 캐릭터 스폰과 RoleTag 배정까지는 로그로 정상 확인되는데 이동, 점프, 시점 조작이 전혀 먹지 않음
반면 DemoMaps를 PIE로 바로 띄워서 시작하면 캐릭터가 멀쩡히 움직임
1차 가설: PlayerController의 BeginPlay 타이밍 문제
레벨 전환(ServerTravel)이 일어나면 GameMode/GameState/PlayerController/Pawn이 전부 파괴되고 새로 생기니까
처음 의심한 건 AFDPlayerController::BeginPlay()에서 AddMappingContext를 호출하는 부분이었음
void AFDPlayerController::BeginPlay()
{
Super::BeginPlay();
if (!IsLocalController()) return;
if (UEnhancedInputLocalPlayerSubsystem* Subsystem =
ULocalPlayer::GetSubsystem<UEnhancedInputLocalPlayerSubsystem>(GetLocalPlayer()))
{
Subsystem->AddMappingContext(DefaultMappingContext, 0);
}
}
Hard Travel(재접속) 과정에서 BeginPlay 호출 시점에 GetLocalPlayer()가 아직 준비되지 않아 Subsystem이 nullptr이 되고 매핑 등록 자체가 스킵되는 게 아닐까 싶어서 BeginPlay에 로그를 추가해서 확인해보니, IsLocalController: true, Subsystem 획득 성공, MappingContext 등록 완료까지 전부 정상적으로 찍힘
매핑 등록까지 다 성공했는데도 전부 안 움직이는 게 도저히 무슨 원인인지 몰랐는데, 팀원분이 원인을 발견함
SetInputMode 때문이었음
Lobby 화면에서는 Start 버튼을 누르기 위해 의도적으로 입력 모드를 UI 전용으로 바꿔뒀었음
// AFDLobbyPlayerController::BeginPlay
FInputModeUIOnly InputMode;
InputMode.SetWidgetToFocus(LobbyWidget->TakeWidget());
SetInputMode(InputMode);
bShowMouseCursor = true;
FInputModeUIOnly는 키보드/게임패드 입력을 게임 월드(InputComponent)가 아니라 지정된 UI 위젯으로만 보내는 설정
즉 캐릭터의 Enhanced Input 매핑이 아무리 정상 등록돼 있어도, Slate 포커스 자체가 UI를 보고 있으면 입력은 거기서 멈춤
해결: Lobby 컨트롤러가 사라지기 전에 입력 모드를 되돌리기
AFDLobbyPlayerController가 파괴되기 직전 호출되는 EndPlay에서 명시적으로 복구하도록 추가
void AFDLobbyPlayerController::EndPlay(const EEndPlayReason::Type EndPlayReason)
{
if (IsLocalController())
{
SetInputMode(FInputModeGameOnly());
bShowMouseCursor = false;
}
GetWorldTimerManager().ClearTimer(RefreshTimerHandle);
Super::EndPlay(EndPlayReason);
}
'프로젝트 > Funny Or Die (멀티플레이 술래잡기 게임)' 카테고리의 다른 글
| 정찰 단계(Scouting) 구현하기 (0) | 2026.07.01 |
|---|---|
| 로비 UI 협업 (0) | 2026.06.30 |
| 레벨별 GameMode 분리와 로비 시스템 구현 (0) | 2026.06.30 |
| 술래/숨는자 역할 배정 - 멀티플레이어 캐릭터 분기 스폰 구현 (0) | 2026.06.30 |
| 기술 설계 초안 (0) | 2026.06.26 |
