簡體   English   中英

UE4 C++ APlayerController::GetHUD 總是返回 null

[英]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

  1. 在控件藍圖中的按鈕事件上運行PlayerController的函數。
  2. 運行ServerRPCSpawnAsPlayableCharacter函數
  3. 在調用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM