ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子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 Spring Frameworkのアノテーション一覧
- 7 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- PHP $_SERVERとは|DOCUMENT_ROOT・PHP_SELFなど主な要素 2026-08-07 17:15:57
- PHPでのファイルアップロード方法|multipart/form-dataと$_FILES 2026-08-07 17:15:57
- Scratchのアカウントの作り方|メールアドレスとユーザー名の登録手順 2026-08-07 17:15:57
- Bluetoothとは|仕組み・BLEとClassicの違い・用途 2026-08-07 17:15:57
- Spring Bootのテスト入門|@SpringBootTestとJUnitでの単体・結合テスト 2026-08-07 17:15:57
- djangoにおけるMVCアプリケーション実装例 2026-08-07 17:15:57
- Scratch 作品の公開方法 2026-08-07 17:15:56
- 【PHPフレームワーク】Laravelの使い方 2026-08-07 17:15:56
- Google OAuth 2.0 認証の実装方法 2026-08-07 17:15:56
- APIキー取得方法 2026-08-07 17:15:56
- インストール方法(Windows版) 2026-08-07 17:15:56
- Java とは?言語仕様・JVM・主要フレームワーク一覧 2026-08-07 17:15:56
- データベースとは?RDB / NoSQL / SQL の基礎 2026-08-07 17:15:56
- インストール(eclipseプラグイン) 2026-08-07 17:15:56
- Spring Frameworkの使い方 2026-08-07 17:15:56
コメントを削除してもよろしいでしょうか?