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);
}

+ Recent posts