[英]UE4 C++ APlayerController::GetHUD always return null
這是我的代碼。
void AFpsCharacter::ClientRPCInitializeHud_Implementation()
{
AFpsPlayerController* PlayerController = (AFpsPlayerController*)GetOwner();
if (IsValid(PlayerController))
{
AFpsPlayerState* State = PlayerController->GetPlayerState<AFpsPlayerState>();
UE_LOG(LogTemp, Log, TEXT("PlayerController now on %s"), *State->GetPlayerName());
HUD = (AFpsHud*)PlayerController->GetHUD(); //AHUD* HUD in AFpsCharacter.
//HUD = Cast<AFpsHud>(PlayerController->GetHUD());
if (!IsValid(HUD))
{
UE_LOG(LogTemp, Log, TEXT("AFpsCharacter::InitializeHud() : HUD is not valid"));
}
}
else
{
UE_LOG(LogTemp, Log, TEXT("PlayerController is not exist"));
}
}
函數ClientRPCInitializeHud()
在角色生成並且PlayerController
擁有它時運行。 我的問題是指針HUD
值無效。 當然,我檢查了GameMode
默認HUD
。 我該怎么做才能獲得APlayerController::GetHUD
?
我只需按照以下步驟運行ClientRPCInitializeHud
。
PlayerController
的函數。ServerRPCSpawnAsPlayableCharacter
函數APlayerController::Possess(SpawnedCharacter)
后運行ClientRPCInitializeHud
函數。這是代碼。
void AFpsPlayerController::OnSelectedTeam(EPlayerTeam team, TSubclassOf<class AFpsCharacter> CharacterClass, FTransform SpawnTransform)
{
ServerRPCSetTeam(team);
ServerRPCSpawnAsPlayableCharacter(CharacterClass, SpawnTransform);
}
void AFpsPlayerController::ServerRPCSpawnAsPlayableCharacter_Implementation(TSubclassOf<AFpsCharacter> CharacterClass, FTransform SpawnTransform)
{
FActorSpawnParameters SpawnParameters;
AFpsCharacter *SpawnedCharacter = GetWorld()->SpawnActor<AFpsCharacter>(CharacterClass, SpawnTransform.GetLocation(), SpawnTransform.GetRotation().Rotator(), SpawnParameters);
SpawnedCharacter->SetSpawnTransform(SpawnTransform);
Possess(SpawnedCharacter);
SpawnedCharacter->OnPossess();
}
void AFpsCharacter::OnPossess()
{
ClientRPCInitializeHud();
}
我試圖檢查 GetPlayerController(0)->GetHUD 是否有效,如果在關卡藍圖或小部件藍圖中調用,但它也是無效的。
我猜問題是默認的 HUD 實例不是由GameMode
默認 HUD 類創建的。 即使我在GameMode
檢查了默認的 HUD 類,我也不知道為什么會發生這種情況。 所以我選擇臨時解決方案。 使用APlayerController::ClientSetHUD(TSubclass<AHUD>)
。 就我而言,每個ACharacter
都有TSubclassOf<AHUD>
並在APlayerController::OnPossess(APawn* InPawn)
處運行APlayerController::ClientSetHUD(TSubclass<AHUD>)
APlayerController::OnPossess(APawn* InPawn)
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.