【问题标题】:UE4 C++ APlayerController::GetHUD always return nullUE4 C++ APlayerController::GetHUD 总是返回 null
【发布时间】:2021-11-09 15:56:41
【问题描述】:

这是我的代码。

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 是否有效,如果在 Level Blueprint 或 Widget Blueprint 中调用,但它也是无效的。

【问题讨论】:

    标签: c++ unreal-engine4


    【解决方案1】:

    我猜问题是默认HUD实例不是由GameMode的默认HUD类创建的。即使我检查了GameMode 中的默认 HUD 类,我也不知道为什么会发生这种情况。所以我选择临时解决方案。使用APlayerController::ClientSetHUD(TSubclass&lt;AHUD&gt;)。就我而言,每个ACharacter 都有TSubclassOf&lt;AHUD&gt; 并在APlayerController::OnPossess(APawn* InPawn) 运行APlayerController::ClientSetHUD(TSubclass&lt;AHUD&gt;)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-05
      • 2023-03-13
      • 1970-01-01
      • 2012-11-18
      • 1970-01-01
      • 1970-01-01
      • 2014-03-04
      • 2016-11-02
      相关资源
      最近更新 更多