お世話になっております。
現在「ForceLayoutPrepass」を使用した際にクラッシュが発生することがあります。
弊社内で調査を行いクラッシュを回避することは出来たのですが対応にあたり幾つかの質問がありご連絡させていただきました。
Widgetの作成方法
1.UGameplayStatics::OpenLevel()を呼び出し
2.AGameStateBase::BeginPlay()内でWBP作成
3.UWidget::NativeConstruct()内で「ForceLayoutPrepass」を使用した際にクラッシュ
質問1.クラッシュ回避方法について
「UWidget::NativeConstruct()」内、または「UUserWidget::CreateWidgetInstance」でWidgetを作成したすぐ後に「ForceLayoutPrepass」を使用していた際にクラッシュが発生していたため
void UWidget::ForceLayoutPrepass()
{
// 追加
if (!FSlateApplication::Get().IsTicking())
{
UE_LOG(LogTemp, Verbose, TEXT("Widget Skip ForceLayoutPrepass"));
return;
}
// 追加
TSharedPtr<SWidget> SafeWidget = GetCachedWidget();
if (SafeWidget.IsValid())
{
SafeWidget->SlatePrepass(SafeWidget->GetTickSpaceGeometry().Scale);
}
}
上記のようにTickが回っている事を確認した後、処理を走らせるよう変更を行いました。
表示崩れなどは発生しましたが、初回Tick後に再度「UWidget::ForceLayoutPrepass()」を走らせることで対応致しました。
開発終盤に差し掛かっており、呼び出しのタイミングの変更を行うことが難しかった為、こちらの対応を行ったのですが問題ありませんでしょうか?
また、正しい対応方法等ありましたらご教授お願い致します。
質問2.ForceLayoutPrepassの安全な使用方法について
質問1にて「「UWidget::NativeConstruct()」内、または「UUserWidget::CreateWidgetInstance」でWidgetを作成したすぐ後に「ForceLayoutPrepass」を使用していた際にクラッシュ」と記述させて頂きましたが、この実装を行った際にクラッシュすることは想定内でしょうか?
もし、想定内であればForceLayoutPrepassの正しい使用方法や使用しても大丈夫かどうかのチェック方法等ありましたらご教授いただければと思います。
[Attachment Removed]