UE4 UUserWidget总是在重新启动UE4或在蓝图编辑器处编译后更改



MyHUD.h

UCLASS()
class FPS_API AMyHUD : public AHUD
{
GENERATED_BODY()
UPROPERTY(EditDefaultsOnly, Category = Gameplay)
class UUserWidget* DefaultWidget;
...
}

我制作蓝图BP_MyHUD扩展了MyHUD和Widget蓝图。问题是,在我重新启动UE4程序或使用蓝图编辑器工具栏中的按钮编译后,BP_MyHUD中的DefaultWidget被设置为None。如何修复BP_MyHUD中DefaultWidget的值?

默认情况下,变量设置为"私人"因此不能在派生类中进行修改。

试着在你说public之后放这个UPPERTY:(你也可以使用protected:(

UCLASS()
class FPS_API AMyHUD : public AHUD
{
GENERATED_BODY()
public:
UPROPERTY(EditDefaultsOnly, Category = Gameplay)
class UUserWidget* DefaultWidget;
...
}

此外,当涉及到蓝图时,我不确定EditDefaultsOnly说明符。我的理解是没有

BlueprintReadWrite

您无法编辑蓝图中的变量。但是,如果你已经成功地将其与其他变量结合使用,那么这可能不是问题所在。

派对迟到了一点,但答案是:

这是不可能的

带有EditDefaultsOnly的非BindWidget指针确实在Details面板中生成了一个选择器,但这个选择器并不意味着在我们组件的原型中选择一个小部件。意味着在组件实例之外选择一个小部件(它也需要是公共的,可能还有一个BlueprintReadWrite(。在这种情况下,您在选择器中输入的值确实会在构建过程中保持不变。

可悲的是,这个错误诱导选择器的出现意味着有两件事不能很好地解决这种行为:

  • 当UE在构建时清除选择器时,它应该会显示一个警告/错误,解释原因
  • 您不应该真的能够将EditAnywhere/EditDefaultsOnly放在非BindWidget属性上,只能放在EditInstanceOnly。。。但也没有任何警告/错误=(

(感谢BenUI的discord社区的@Bohdon Sayre在这件事上帮助了我(

我对前面的答案不满意,如果有人遇到同样的问题,下面是你可以做的:

  • 声明一个SubClassOf以便能够选择您的小部件
  • 在beginPlay((中实例化小部件并存储其指针
  • 使用指针对小部件实例执行任意操作
/// IN YOUR HEADER
UCLASS()
class FPS_API AMyHUD : public AHUD
{
GENERATED_BODY()
/* The widget you want to select */
UPROPERTY(EditDefaultsOnly, Category = Gameplay)
TSubclassOf<UUserWidget> BP_DefaultWidget;

/* The instance of your widget to use */
UPROPERTY(Transient, Category = Gameplay)
UUserWidget* DefaultWidgetInstance;
...
}


/// IN YOUR CPP
void AMyHUD::BeginPlay()
{
Super::BeginPlay();
if (BP_DefaultWidget)
{
DefaultWidgetInstance = CreateWidget<UUserWidget>(GetWorld(), BP_DefaultWidget, FName("DefaultWidget"));
DefaultWidgetInstance->AddToViewport();
}
}

最新更新