SColorPicker with NativeWidgetHost cannot be packaged with an error related to TSharedPtr.

こんにちは、日本語で失礼いたします。

##対策について

RebuildWidget()をoverrideして、その中でColorPickerを作ると問題が発生しなくなりました。

// .h
UCLASS()
class COLORPICKERTEST419_API UNativeWidgetHostColorPicker : public UNativeWidgetHost
{
  GENERATED_BODY()

public:
  UNativeWidgetHostColorPicker(const FObjectInitializer& ObjectInitializer);
  virtual TSharedRef<SWidget> RebuildWidget() override;
};

// .cpp
UNativeWidgetHostColorPicker::UNativeWidgetHostColorPicker(const FObjectInitializer& ObjectInitializer) : UNativeWidgetHost(ObjectInitializer) 
{
}

TSharedRef<SWidget> UNativeWidgetHostColorPicker::RebuildWidget()
{
  this->SetContent( SNew(SColorPicker) );
  return this->GetContent().ToSharedRef();
}

下記の記事を参考にしています。

また、UButtonなど既存のUWidget派生オブジェクトの作り方を見る限り、Constructorでは固有パラメータの初期化のみ行って、SWidget派生オブジェクトはやはりRebuildWidget内でSNewするのが良いようです。
(このあたりの作法に言及しているドキュメントが見つけられませんでした…)

##エラーの原因について
SColorPickerのインスタンス生成中、FSlateApplicationBaseの実体がない段階でShared参照を得ようとして死んでいたようです。
Packaging処理の中でそのようなタイミングがあるのだと思います。
SColorSpectrumは構築処理でFSlateApplicationBaseにアクセスしないのでセーフだった様です。

※Slateにあまり詳しくないので、勘違いなどあるかもしれません。ご容赦ください。

ご不明な点などありましたらお知らせください。
以上です。

1 Like