작성
·
38
·
수정됨
0
왜 인지는 모르겠지만, 8강을 시작하면서
밑에 있는 코드의 GetController()에서 NULL을 반환하고 있어 게임 플레이가 안되던 문제가 있었습니다.
void AABCharacterPlayer::SetCharacterControl(ECharacterControlType NewCharacterControlType)
{
UABCharacterControlData* NewCharacterControl = CharacterControlManager[NewCharacterControlType];
check(NewCharacterControl);
SetCharacterControlData(NewCharacterControl);
APlayerController* PlayerController = CastChecked<APlayerController>(GetWorld()->GetFirstPlayerController());
if (UEnhancedInputLocalPlayerSubsystem* Subsystem = ULocalPlayer::GetSubsystem<UEnhancedInputLocalPlayerSubsystem>(PlayerController->GetLocalPlayer()))
{
Subsystem->ClearAllMappings();
UInputMappingContext* NewMappingContext = NewCharacterControl->InputMappingContext;
if (NewMappingContext)
{
Subsystem->AddMappingContext(NewMappingContext, 0);
}
}
CurrentCharacterControlType = NewCharacterControlType;
}
아직 Pawn이 컨트롤러를 얻은 시점이 아니라서 NULL 값으로 반환된다고 합니다.
GetWorld()->GetFirstPlayerController()를 호출해서 컨트롤러를 반환할수 있던데, Pawn이 컨트롤러를 얻은 시점이 언제인가요?
답변 1
0
컨트롤러가 Pawn을 빙의하는 시점은 OnPossess이고, 이 함수에서 폰의 PossessedBy를 호출해서 빙의되는 시점을 폰에게 알려줍니다. 즉 질문에 대한 답은 PossessedBy함수를 사용하시면 됩니다.
그런데 SetCharacterControl 함수는 BeginPlay에서 호출되지 않나요? 싱글플레이라면 일반적으로 컨트롤러와 폰 셋업이 다 끝난상황인데 널이 나온다면 게임 설정이나 시작지점이 잘못되어 빙의가 안된게 아닌가 싶습니다.
void APlayerController::OnPossess(APawn* PawnToPossess)
{
if ( PawnToPossess != NULL &&
(PlayerState == NULL || !PlayerState->IsOnlyASpectator()) )
{
const bool bNewPawn = (GetPawn() != PawnToPossess);
if (GetPawn() && bNewPawn)
{
UnPossess();
}
if (PawnToPossess->Controller != NULL)
{
PawnToPossess->Controller->UnPossess();
}
PawnToPossess->PossessedBy(this);
....
}
언리얼의 플레이 모드가 Simulate로 돼있어서 생긴 이슈였습니다!
Selected Viewport로 변경하니 잘 나옵니다 감사합니다!