ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
この記事の要点
- UE5 UMG の Widget は Z-Order が大きいほど手前に描画される
AddToViewport(ZOrder)の第 2 引数で重ね順を指定(既定 0)- Canvas Panel 上の子 Widget は 階層順 + Z-Order スロットで前後が決まる
- RemoveFromParent で Widget を非表示。
SetVisibility(Hidden)でも一時的に隠せる - Dialog / Toast / HUD のような常に手前に出したい UI は ZOrder を 100 / 1000 と大きな値に
1UMG Widget と Z-Order の基本
Unreal Engine 5 の UI システムUMG(Unreal Motion Graphics)では、画面上に複数の Widget を重ねて表示できます。HUD / メニュー / ダイアログ / トーストなどが同時に表示されると、どれを手前に描画するかをZ-Orderで制御します。
| Z-Order の値 | 描画位置 |
|---|---|
| 小さい(マイナス OK) | 奥(背面)に描画 |
| 0(既定) | 標準レイヤー |
| 大きい | 手前(前面)に描画 |
2方法1: AddToViewport(ZOrder) で指定
もっとも一般的な方法。Widget をビューポートに追加する際の第 2 引数に Z-Order を指定します:
// C++ から
void AMyPlayerController::ShowHUD()
{
if (HUDWidgetClass)
{
HUDWidget = CreateWidget<UUserWidget>(this, HUDWidgetClass);
HUDWidget->AddToViewport(0); // Z-Order 0(標準レイヤー)
}
if (DialogWidgetClass)
{
DialogWidget = CreateWidget<UUserWidget>(this, DialogWidgetClass);
DialogWidget->AddToViewport(100); // Z-Order 100(HUD より手前)
}
if (ToastWidgetClass)
{
ToastWidget = CreateWidget<UUserWidget>(this, ToastWidgetClass);
ToastWidget->AddToViewport(1000); // 最前面に通知バナー
}
}
Blueprint からは Create Widget → Add To Viewport ノードの Z Order ピンに値を入力します。
3方法2: Add To Player Screen
マルチプレイ環境で特定のプレイヤー画面だけに表示したい場合は AddToPlayerScreen(ZOrder)。スプリットスクリーンや LAN プレイで重要。
// LocalPlayer ごとに Widget を追加
HUDWidget->AddToPlayerScreen(0);
// 削除も Player 単位
HUDWidget->RemoveFromParent(); // ビューポート / プレイヤースクリーンどちらでも
4方法3: Canvas Panel の Z-Order Slot
1 つの Widget Blueprint 内で複数の子要素を重ねる場合、Canvas Panel の子スロットに ZOrder プロパティがあります:
- Widget Blueprint Editor で Hierarchy パネルを開く
- Canvas Panel の下に複数の子(Image / Button / Text)を配置
- 各子を選択 → Details パネル → Slot (Canvas Panel Slot) セクション → Z Order
- 大きい値ほど前面(HUD上の警告アイコンなど)
| 方式 | 用途 |
|---|---|
| AddToViewport の Z-Order | Widget 全体(HUD と Dialog 等)の重ね順 |
| Canvas Panel Slot の Z-Order | 1 つの Widget 内での子要素の重ね順 |
| Hierarchy の順序 | Z-Order が同じ場合に下の方が前面 |
5動的に Z-Order を変える
Widget をビューポートに追加した後でも Z-Order を変えたいケース(例: モーダルがアクティブになったら最前面に):
// 一度 RemoveFromParent → 再度 AddToViewport で更新
DialogWidget->RemoveFromParent();
DialogWidget->AddToViewport(2000); // 新しい Z-Order
// または Canvas Slot の場合
UCanvasPanelSlot* Slot = Cast<UCanvasPanelSlot>(ChildWidget->Slot);
if (Slot)
{
Slot->SetZOrder(50); // ★ 動的変更
Slot->SetPosition(FVector2D(100, 200));
Slot->SetSize(FVector2D(400, 100));
}
6SetPositionInViewport で座標も制御
// Widget の絶対座標を指定(スクリーン座標)
HUDWidget->SetPositionInViewport(FVector2D(100, 50), false);
// 第 2 引数 bRemoveDPIScale: false で生のピクセル座標
// true で DPI スケールを適用
7Visibility と Z-Order の使い分け
| 目的 | 推奨手段 |
|---|---|
| 一時的に隠す(再表示が早い) | SetVisibility(Hidden) |
| 完全に消す(メモリも解放したい) | RemoveFromParent() + null 代入 |
| クリック不可だが表示 | SetVisibility(HitTestInvisible) |
| クリック可だが子を透過 | SetVisibility(SelfHitTestInvisible) |
| 常に手前 | Z-Order を 1000+ に |
| 常に背面 | Z-Order を -100 等のマイナスに |
8典型的な Z-Order 設計
1 タイトルで複数の Widget が混在する場合の推奨レイヤー設計:
| レイヤー | Z-Order | 用途 |
|---|---|---|
| 背景レイヤー | -10 | カットイン背景 |
| HUD | 0 | ヘルスバー、ミニマップ |
| サブメニュー | 10 | インベントリ / マップ |
| メインメニュー | 100 | ポーズ画面 |
| ダイアログ | 500 | 確認ダイアログ |
| システム通知 | 1000 | セーブ完了トースト |
| デバッグ | 10000 | FPS / ログ表示 |
9Blueprint での実装例
Blueprint ノードで以下の流れ:
- Event BeginPlay(Player Controller などで)
- Create Widget → Class: HUD Widget
- Add to Viewport → Z Order: 0
- 変数
HUDRefとして保持 - 必要時に Create Widget → Dialog → Add to Viewport → Z Order: 100
- 閉じる時は変数経由で Remove from Parent
10FAQ
Q: AddToViewport を 2 回呼んだら 2 回表示される?
A: はい、同じインスタンスが二重に登録されるか、Engine バージョンによっては警告。すでに表示されているかチェックするか、IsInViewport() を使ってください。
Q: Z-Order を同じにしたら描画順は?
A: 追加順(後から追加されたほうが前面)。Canvas Panel 内では Hierarchy の順序。
Q: Widget が他の Widget に隠れて操作できない
A: 上に乗っている Widget が透明で Visibility = Visible だとマウスイベントを吸収します。透明領域には Hit Test Invisible を設定。
Q: フォーカスが取られない
A: SetUserFocus(PlayerController) を呼ぶ、または Widget の Is Focusable を ON。
ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
子ページはありません
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript で base URL を取得する方法|window.location.origin
- 4 YouTube Data API v3 エラー一覧|403・400・404 の原因と対処
- 5 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 6 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 7 Spring Frameworkのアノテーション一覧
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- 【django】ログイン 認証機能 2026-09-08 03:22:09
- MySQL ERROR 1063 Incorrect column specifier for column|原因と直し方 2026-09-08 03:11:09
- 【PHPエラー】Object of class stdClass could not be converted to string 2026-09-07 07:46:04
- Julia Genie ローカル開発サーバ起動完全ガイド 2026-09-07 07:46:04
- Wi-Fi とは|規格と世代(Wi-Fi 4〜7)・周波数帯・CSMA/CA・WPA3 NEW 2026-09-07 07:45:13
- set コマンドでシェルオプションと位置パラメータを操作 | bash 2026-09-07 07:45:13
- JPEG(.jpg/.jpeg)画像形式の完全ガイド — 仕様・マジックナンバー・他形式との比較・EXIF 2026-09-07 07:45:13
- UE5 Get Overlapping Actorsで特定クラスだけ処理|Class Filter・Cast To 2026-09-07 07:45:13
- Linuxで特定拡張子のファイルを再帰削除|find -deleteの安全手順 2026-09-07 07:45:13
- Django CBVでテンプレートに値を渡す|get_context_data・extra_context 2026-09-07 07:45:13
- Linuxで複数ファイルの文字列を一括置換|find・sed・xargsの安全手順 2026-09-07 07:45:13
- Laravelルートグループ|prefix・middleware・nameで一括管理 2026-09-07 07:45:13
- Linux whichコマンドの使い方|絶対パス取得とtype・command -vの違い 2026-09-07 07:45:13
- Linux catコマンドの使い方|行番号表示・複数ファイル連結 2026-09-07 07:45:13
- unable to execute 'gcc': No such file or directory 2026-09-07 07:45:13
コメントを削除してもよろしいでしょうか?