0

我刚刚开始学习使用 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?也许修复这个错误。

4

0 回答 0