いつもお世話になっております。
ただいま、Add to Viewport を使用して表示されているHUD達を一括で表示・非表示する方法を探しております。
実現する事のできる関数や方法は、ございますか?
以上、よろしくお願いいたします。
いつもお世話になっております。
ただいま、Add to Viewport を使用して表示されているHUD達を一括で表示・非表示する方法を探しております。
実現する事のできる関数や方法は、ございますか?
以上、よろしくお願いいたします。
お世話になっております。
最も導入が楽な方法は Get All Widgets of Class
ノード又は Get All Widgets with Interface
ノードを使う方法です。こちらのノードを使用することでAdd to Viewportされた全Widgetを取得する事が可能です。また、引数の Top Level Only
を有効にすれば各UIにて最も親になるWidgetのみを取得する事が可能です(今回のように一括で表示・非表示したい場合は有効にした方が良いかと思います)。そして、取得したWidgetの配列の各要素に対して Set Visibility
を使うことで表示・非表示を切り替える事が可能です。なお、非表示の際は処理負荷の関係で Hidden
ではなく Collapsed
を使用することを推奨します。
ただし、Widgetの数が増えるほどGet All Widgets~の負荷が問題になる可能性が高くなるため、Add to Viewportされた各UIの参照を管理するManagerを用意することも検討する必要があるかと思います。
その他の方法としては、UGameViewportClient
が管理しているWidgetを直接制御しに行く方法があります。残念ながら標準のエンジンでは 全てのWidgetを一括で取り除く Remove All Widgets
ノードしか用意されていないのですが、 UWidgetLayoutLibrary::RemoveAllWidgets
における実装を参考に一括で表示ON・OFFを行う処理を実装することも可能かと思います。
ご参考になれば幸いです。
よろしくお願いいたします。
情報、ありがとうございます。
参考にさせていただきます。
WidgetをCollapsed等で非表示にしていると非表示にする前に再生を開始したWidgetのアニメーション等が一時停止すると認識しているのですが
こちらを、停止しないようにする事は可能でしょうか?
非表示ながらも、Widgetアニメーションは更新させたいと考えております。
以上、よろしくお願いいたします。
情報、ありがとうございました。
教えていただいた内容を試してみます。
お世話になっております。
非表示中のUMGのアニメーション更新に関する要望は過去に頂いているのですが、残念ながら現状対応時期は未定です。
[UMG Animations do not play while the widget is offscreen][1]
上記のリンク先では、UUserWidget::TickActionsAndAnimationで実装されているアニメーション更新処理を非表示中も実行するためのFTickableGameObjectを追加する対応が提案されています。
個人的には、シンプルなアニメーションの場合は非表示時のアニメーション再生時間を保存し、再表示時にその保存した値を元にアニメーションを再開する処理を実装した方が対応コスト・処理負荷の面で優位かと思います。ただし、各Widgetに対してこの実装を入れる必要があるという懸念はあります。
もし非表示による負荷軽減が重要ではない場合は、SetVisibilityを使うのではなく、WidgetのSet color and Opacityを用いてWidget全体のα値を制御して表示ON・OFFをした方が良いのかもしれません。単純に透明にしているだけですので、アニメーションなどのTick処理が走ります。また、こちらであればUMG毎に対応を入れる必要がありません。
まずはこれらの方法を一度ご検討頂けますと幸いです。
よろしくお願いいたします。