対象Ver:UE4.25.0
#1. レイヤーとZOrder
Widgetは基本的に後から追加されたものを優先して表示(重なっている場合は優先して)表示します。複数のWidgetが同一階層にある場合はこのルールが適用されますが、Canvas Panelを利用することで描画順に関係無く指定のWidgetを優先して表示するようなことも可能です。これはWidget同士の深度情報を管理するための値(ZOrder)によって制御することもできます。
[[APIドキュメント] UCanvasPanelSlot] (https://docs.unrealengine.com/en-US/API/Runtime/UMG/Components/UCanvasPanelSlot/index.html
User Widget:UGameViewportClient::ViewportOverlayWidget)
[APIドキュメント] UGameViewportClient
Widgetを表示する時は AddToViewport()
を利用するように、Viewportが最終的にそれらのWidgetを登録して管理します。最初に追加され®他時に UGameViewportClient::AddViewportWidgetContent
を実行してTreeに登録します。Widgetを削除する際には RemoveFromParent()
を利用して UGameViewportClient::RemoveViewportWidgetContent
から取り除かれます。それらのWidgetは最終的にレベルの遷移時などに UGameViewportClient::RemoveAllViewportWidgets
から纏めて破棄されます。
以下は同一レイヤーにあるWidgetとZOrderの関連性を示した図です。
1UserWidget内でOverlayのZOrderの違い :左は全て0なので後から追加したWidgetが上にくる、右は後から追加したWidgetのZOrderが小さいので先に追加したWidgetが前面に来るケース
UserWidget同士のZOrderの違い :左は全て0なので後から追加したUser Widgetが上にくる、右は上記のケースと同じで先に追加したWidgetが前面に来るケース
#2. ZOrderの指定と変更
ZOrderを変更する事で簡単に描画順番を変更することが可能です。ただしそれらを指定/変更するには以下のような制約があります。
・User Widget
動的な変更は提供していません。AddToViewportで生成時か、Designer上での指定のみです。
・Widget
動的な変更はCanvas SlotからSetZOrderで可能、静的な変更はDesigner上での指定が可能です。
動的にUser Widgetの変更する方法についてはデフォルトではありませんが、以下のブログのやり方が参考になるかと思います。
https://sunghwanpark.github.io/unreal/30/