[英]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
。
PlayerController
's function on button event in Widget Blueprint .PlayerController
的函数。ServerRPCSpawnAsPlayableCharacter
functionServerRPCSpawnAsPlayableCharacter
函数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.