2023/09/30_UE5.3_問題:ProgressBarとパーセントテキストが更新されない
解決
スレートウィジェットはデフォルトでは更新できないらしい。
ForceVolatile(true);を使うと解決。
// WidgetTypeが SProgressBar かどうかをチェック
if (WidgetType == "SProgressBar")
{
// SProgressBarを初期化
SlateProgressBar = SNew(SProgressBar);
// 見つけた SProgressBar を SlateProgressBar に代入する
SlateProgressBar = StaticCastSharedPtr<SProgressBar>(SlateWidget);
// SlateProgressBarにSetPercent(0.0f)をセット
SlateProgressBar->SetPercent(0.0f);
// SlateProgressBarにSetPercenで更新できるようにする
SlateProgressBar->ForceVolatile(true);
return true; // プログレスバーを見つけた場合はtrueを返す
}
// テキストが%または%かチェック
FString TextString = Text.ToString();
if (TextString == TEXT("%") || TextString == TEXT("%"))
{
//SlatePercentageTextを初期化
SlatePercentageText = SNew(STextBlock);
// テキストを SlatePercentageText に代入
SlatePercentageText = TextBlock;
// SlatePercentageTextにSetText(FText::FromString("0%"))をセット
SlatePercentageText->SetText(FText::FromString("0%"));
// SlatePercentageTextを更新できるようにする
SlatePercentageText->ForceVolatile(true);
return true; // テキストが見つかった場合はtrueを返す
}
SWidget::ForceVolatile
https://docs.unrealengine.com/5.3/en-US/API/Runtime/SlateCore/Widgets/SWidget/ForceVolatile/
更新処理後にこれを呼び出したら再描画されるらしい。試してはいない。
SWidget::Invalidate
https://docs.unrealengine.com/5.3/en-US/API/Runtime/SlateCore/Widgets/SWidget/Invalidate/
ChatGPT
SWidget::ForceVolatileを呼び出すことで、ウィジェットを常に揮発性として表示することができます。揮発性のウィジェットは、ジオメトリやレイアウトデータがキャッシュされず、その子ウィジェットもキャッシュされません。このため、ウィジェットが再描画され、その内容が常に最新のもので表示されます。
SWidget::ForceVolatileメソッドは、以下のように使用できます:
if (SlatePercentageText.IsValid())
{
SlatePercentageText->ForceVolatile(true); // ウィジェットを常に揮発性として表示する
}
このコードを実行すると、SlatePercentageTextが常に再描画され、キャッシュされなくなります。これにより、ウィジェットの内容が常に最新のもので表示されるようになります。ただし、これを過度に使用するとパフォーマンスの問題が発生する可能性があるため、適切なタイミングでのみ使用することが重要です。