繁体   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