InitializeからNativeConstructまでの間にSlateのポインタが参照されてしまうので、NativeConstructのタイミングでWidgetTreeのRootWidgetを書き換えるのでは遅い、という理解です
WidgetReflectorで参照したところ、NativeConstructで記述した場合は、RootWidgetが見つからなかった場合のためのSSpacerが挿入されていました ( UUserWidget::RebuildWidget
を参照のこと)
UUserWidget::Initialize()
をオーバーライドし、そこでRootWidget(CanvasPanel)の追加をしてみてください
その他の要素の設定はNativeConstructでOKです
bool UMyUserWidget::Initialize()
{
bool Result = Super::Initialize();
if (!HasAnyFlags(RF_ClassDefaultObject))
{
RootCanvas = WidgetTree->ConstructWidget<UCanvasPanel>();
WidgetTree->RootWidget = RootCanvas;
}
return Result;
}
void UMyUserWiget::NativeConstruct()
{
// ...
}
参考: