简体   繁体   English

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

[英]UE4 C++ APlayerController::GetHUD always return null

Here is my code.这是我的代码。

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"));
     }
 }

The function ClientRPCInitializeHud() is run when the character is spawned and PlayerController possess it.函数ClientRPCInitializeHud()在角色生成并且PlayerController拥有它时运行。 My problem is the pointer HUD has invalid value.我的问题是指针HUD值无效。 Of course i checked default HUD of GameMode .当然,我检查了GameMode默认HUD What can i do for get valid value of APlayerController::GetHUD ?我该怎么做才能获得APlayerController::GetHUD

I just follow the step below to run ClientRPCInitializeHud .我只需按照以下步骤运行ClientRPCInitializeHud

  1. Run PlayerController 's function on button event in Widget Blueprint .在控件蓝图中的按钮事件上运行PlayerController的函数。
  2. Run ServerRPCSpawnAsPlayableCharacter function运行ServerRPCSpawnAsPlayableCharacter函数
  3. Run ClientRPCInitializeHud function after call APlayerController::Possess(SpawnedCharacter) .在调用APlayerController::Possess(SpawnedCharacter)后运行ClientRPCInitializeHud函数。

Here is the code.这是代码。

 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();
 }

I tried to check GetPlayerController(0)->GetHUD is valid or not if is called at Level Blueprint or Widget Blueprint but it is also invalid.我试图检查 GetPlayerController(0)->GetHUD 是否有效,如果在关卡蓝图或小部件蓝图中调用,但它也是无效的。

I guess the problem is the default HUD instance isn't created by default HUD class of GameMode .我猜问题是默认的 HUD 实例不是由GameMode默认 HUD 类创建的。 I don't know well why it is happened even i checked default HUD class in GameMode .即使我在GameMode检查了默认的 HUD 类,我也不知道为什么会发生这种情况。 So i choose temporary solution.所以我选择临时解决方案。 Using APlayerController::ClientSetHUD(TSubclass<AHUD>) .使用APlayerController::ClientSetHUD(TSubclass<AHUD>) In my case, each ACharacter has TSubclassOf<AHUD> and run APlayerController::ClientSetHUD(TSubclass<AHUD>) at APlayerController::OnPossess(APawn* InPawn) .就我而言,每个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