为什么变量在虚幻引擎中为空?

Dim*_*zyr 3 c++ pointers casting c++11 unreal-engine4

我想调用函数,它会更改小部件内的文本。

有一个virtual函数NativeConstruct,它会自动调用。它会更改小部件的文本,但我需要调用函数F1并向其发送我想要显示的文本。但是当我调用它时,变量Namenullptr. 由于某种原因nullptr,当程序调用NativeConstruct.

  • Name 是我的文本变量,我想改变
  • dialogBottom 是具有此变量的小部件的名称

已编辑

UAccessWidgetFromCpp* AccessWidgetFromCpp 
= CreateWidget<UAccessWidgetFromCpp>(
      GetWorld()->GetFirstPlayerController(), UAccessWidgetFromCpp::StaticClass()
   );

if (AccessWidgetFromCpp)
{
   AccessWidgetFromCpp->F1("222");
   widgetDialogBottomInstance->AddToViewport();
}

UCLASS()
class HOME_API UAccessWidgetFromCpp : public UUserWidget
{
   GENERATED_BODY()

public:
   UPROPERTY(BlueprintReadOnly, meta = (BindWidget))
   class UTextBlock* Name = nullptr;

   UFUNCTION()
   void F1(FString text);
};

void UAccessWidgetFromCpp::F1(FString text)
{
   if (auto widget = dynamic_cast<UTextBlock*>(GetWidgetFromName(TEXT("Name"))))
   {
      Name = widget;
      Name->SetText(FText::FromString(text));
   }
}
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

在此处输入图片说明

JeJ*_*eJo 5

UPROPERTY的一开始Name还没有初始化nullptr。因此,它可以在其中包含任何垃圾值

nullptr在类定义或UAccessWidgetFromCpp(如果有)的构造函数中将其初始化为。例如,这将解决问题

UPROPERTY(BlueprintReadOnly, meta = (BindWidget))
class UTextBlock* Name = nullptr;
//                     ^^^^^^^^^^
Run Code Online (Sandbox Code Playgroud)

关于新的更新:

首先,您应该避免在 C++ 中使用 c 风格的强制转换。其次,该函数GetWidgetFromName返回一个给定名称对应的uobject 小部件。因此,您应该确保有一个带有“ Name”的。

否则,通过仔细检查nullptr场景来确保您的代码安全。

if(auto widget = dynamic_cast<UTextBlock*>(GetWidgetFromName(TEXT("Name")))) 
{
    Name = widget;
    Name->SetText(FText::FromString(text));
}
Run Code Online (Sandbox Code Playgroud)

即使现在你没有达到行Name->SetText(FText::FromString(text));方式,无论你有没有部件被称为“ Name”或者是不可能投下UWidget*一个UTextBlock*。您可能需要重新设计如何执行此操作。