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が常に再描画され、キャッシュされなくなります。これにより、ウィジェットの内容が常に最新のもので表示されるようになります。ただし、これを過度に使用するとパフォーマンスの問題が発生する可能性があるため、適切なタイミングでのみ使用することが重要です。