UE5 Common UI お試し ① ボタンのアイコンを出し分ける

環境

UE 5.0.3

Common UI 便利そうだがよく分からない

Unreal Engine の詳細なユーザー インターフェース用の Common UI プラグイン | Unreal Engine ドキュメント

私のスキルではドキュメントからの読解が難しく、まずは基本的な部分から書きながら試すことにしました。

参考

チュートリアルでも触れられていますが、「機能別サンプル」の Common UI のサンプルが教材として良さそうなので参考にしました。

コンソール固有の UI 要素

コンソール固有の UI 要素 | Unreal Engine の共通 UI による高度なマルチプラットフォーム ユーザー インターフェースの概要について説明します。 | Unreal Engine ドキュメント

Common UI には、マルチレイヤーメニューや、ナビゲーションサポート、入力ルーティングなどいくつかの機能が提供されていますが、今回は見た目にも分かりやすく、クイックスタートでも説明されているコンソール固有の UI 要素の機能を試します。

利用する画像

Xelu's FREE Controller Prompts

機能別サンプルの画像を使っても良かったのですが、今回は上記のアイコンを利用しています。

サンプルコード

Release blog20221025 · dany1468/UE_CommonUISample · GitHub

今回の記事のコードは上記にあります。引き続きコードを追加するため、この記事を書いた時点は blog20221025 のタグを付けてあります。
(C++ プロジェクトになっていますが、エンジンのコードにジャンプしたい以上の理由は無いので、C++ 側でコードを書いてはいません)

今回追加したコードは全て Sample フォルダに入れています。

チュートリアルに沿って

Unreal Engine の共通 UI クイックスタート ガイド | Unreal Engine ドキュメント

1. ビューポートの入力ルーティングの設定

そのままなのでスキップ。当然ながら CommonGameViewportClient は Common UI プラグインを有効にしないと出てきません。

2. 入力アクション データ テーブルを作成する

機能別サンプルと同様に NavigationInputActionDataTable という名前の Data Table Asset を作ります。機能別サンプルとほぼ同じですが以下のような内容です。

Forward Back

続いて以下の tips の内容を追加します。

バージョン管理での競合を減らすために、関連する一連のアクションを独自のデータ テーブルにグループ化します。たとえば、すべてのメニュー ナビゲーション アクションを 1 つのテーブルにまとめ、より専門的なメニューのアクションも独自のテーブルにまとめます。その後、これらのデータ テーブルを参照する単一の複合データ テーブルを作成します。

これも機能別サンプルと同様ですが、Composite Data Table を InputActionDataComposite という名前で作成します。

内容もサンプルと同じですが、エンジンに含まれている Data Table と合わせて設定しています。

3. デフォルトのナビゲーション アクションの設定

ここに関しては今回はスキップします。

4. コントローラー データ バインディング (プラットフォーム固有の UI 要素)

こちらも機能別サンプルと同じく GenericGamepadBrushes, KeyboardInputBrushes を作成します。(機能別サンプルでは touch も作成していますが、今回は省きます)

最初に書いた通りでアイコンは別サイトから持ってきています。(CC0 でしたので Githubリポジトリには含めさせてもらっています)

Keyboard
Gamepad

チュートリアル通りではありますが Project Settings の方の設定は以下のようになっています。(先頭の Input Data は 3 を省いたので未設定です)

UI を作る

チュートリアルに沿った内容はここまでで、ここからは上記を利用するための UI を書きます。

外側を作る

Widget Blurprint ではなく、それを継承した CommonActivatableWidget から Widget を作成します。

今回のサンプルコードでは WBP_Menu という名前で作成しています。

Auto Activate

今回は表示された時点でこの Widget を Active 状態にしたいので Auto Acitvate にチェックをします。これをしないと後述のボタンのアイコン表示が機能しません。

ボタンを作る

機能別サンプルでは CommonUI_Button という名前で作られていますが、今回のサンプルでは WBP_CommonButton としました。

継承元は同じく Common Button Base です。

上記の通り、機能別サンプルとほぼ変わらないボタンです。

ボタンのテキストに関しては、機能別サンプルは直接レイアウト時に指定していますが、今回のサンプルでは Data Table の Display Name から取得することにしました。

配置する

作成した外側にボタンを配置します。今回のサンプルでは、Data Table で定義した Forward, Back のボタンを配置します。

Forward Back

Triggering Input Action に適切なものを設定しているだけです。ここで設定した値が先程の WBP_CommonButton の内部で CommonActionWidget に設定され、アイコンが切り替わるようになります。今回はテキスト付きのボタンの体裁を取りましたが、もちろん CommonActionWidget を直接配置・設定しても大丈夫です。

加えて、今回は簡単な動作確認のためにボタンクリック時に Print String でクリックされたボタンだけが分かるようにしています。

UI の表示

今回のサンプルでは PlayerController で Tab キーをトリガーに Widget を表示するようにしています。

実行

youtu.be

ゲームパッドも挿した状態で持ち替えながら実行しています。持ち替えて何らか最初の入力があれば切り替わるという感じです。

まとめ

書き終わってみるとチュートリアルと機能別サンプルのままみたいな感じでしたが、記事や完成済みのサンプルを眺めるだけだと繋がりがイマイチ分からない部分が理解できた気がします。