我刚刚开始学习使用 Unreal Engine 4.26.2 开发游戏的 C++。
我真的不知道我在做什么。
我创建了一个 UMG.UserWidget 来显示 HUD。然后我创建了一个继承自 UserWidget 的 C++ 类。在那之后,我有了那个UMG.UserWidget的reparent蓝图。我这样做是因为我想从 C++ 代码中访问这个小部件(以更新玩家分数)。
除此之外,我还有一个继承自 AHUD 的 C++ 类。我使用这个类来显示 UMG.UserWidget 与此代码:
自定义 C++ HUD 构造函数
APongHUD::APongHUD()
{
PlayerHudWidget = NewObject<UPlayerHUDWidget>(UPlayerHUDWidget::StaticClass());
ConstructorHelpers::FClassFinder<UUserWidget> WBPPlayerHudFinder(TEXT("/Game/Blueprint/Widgets/UI/UMG_PlayerHUD"));
if (WBPPlayerHudFinder.Succeeded())
{
HudClass = WBPPlayerHudFinder.Class;
}
else
{
PlayerHudWidget = nullptr;
}
}
开始播放
void APongHUD::BeginPlay()
{
Super::BeginPlay();
if (HudClass)
{
Widget = CreateWidget<UUserWidget>(GetWorld(), HudClass);
Widget->AddToViewport();
PlayerHudWidget = Cast<UPlayerHUDWidget>(Widget);
}
}
我已经用该行尝试了这段代码,PlayerHudWidget = Cast<UPlayerHUDWidget>(Widget);
并用同样的错误对其进行了评论。
当我尝试使用此功能更改分数时出现问题:
void APongHUD::SetAIScored(int value)
{
if (PlayerHudWidget != nullptr)
{
PlayerHudWidget->SetAIScore(value);
}
}
在这一行if (PlayerHudWidget != nullptr)
我得到错误:
发生异常:读取访问冲突。这是空指针。
这是UPlayerHUDWidget
头文件:
#pragma once
#include "CoreMinimal.h"
#include "Blueprint/UserWidget.h"
#include "PlayerHUDWidget.generated.h"
/**
*
*/
UCLASS()
class POMG_API UPlayerHUDWidget : public UUserWidget
{
GENERATED_BODY()
public:
UPROPERTY(BlueprintReadWrite, meta = (BindWidget))
class UTextBlock* Player_Score;
class UTextBlock* AI_Score;
void SetPlayerScore(int NewScore);
void SetAIScore(int NewScore);
};
及其实现:
#include "PlayerHUDWidget.h"
#include "Components/TextBlock.h"
void UPlayerHUDWidget::SetPlayerScore(int NewScore)
{
Player_Score->SetText(FText::AsNumber(NewScore));
}
void UPlayerHUDWidget::SetAIScore(int NewScore)
{
AI_Score->SetText(FText::AsNumber(NewScore));
}
我的问题是我不知道如何UMG.UserWidget
从 C++ 更新 HUD,而且我正在尝试它不起作用。
如何 UMG.UserWidget
从 C++ 更新 HUD?也许修复这个错误。