Introduction to Common UI | Inside Unreal を視聴してのログとコード
ビデオ
視聴しつつのコード
GitHub - dany1468/UIDemoStream
視聴ログ
- トップダウンプロジェクト
- Common UI Plugin を有効化
- 以下のプロジェクト設定
UI,Blueprint,Mapsフォルダ作成MapsにDemoGameFrontendフォルダを Empty で作成UIにData,Iconsフォルダ作成DataにDataTableを作成
- このデータテーブルはインゲーム用とメニュー用のように複数に分割することが可能
- 分割方法に間違いというものは無い
- DataTable に基本的な 4 つの入力を追加

- 特定のプラットフォームで A, B の位置が変わるような場合には
Gamepad Input Overridesを利用 
- 上記では Generic しか出ていないが、SDK を利用してソースビルドすれば選択肢が出てくる
CommonInputBaseControllerDataを継承した BP を 2 つ作成する
- 1 つは
InputData_PC_Keyboard, もう1 つはInputData_PC_Gamepadとする - ボタンアイコンの情報を保持する
InputData_PC_Gamepad
Gamepad Platform Nameは Mac など他のデスクトッププラットフォームを指定できる
Iconsフォルダにアイコンを入れる
- Texture Group を一括で変更する


- テクスチャのサポートと設定 | Unreal Engine ドキュメント
InputData_PC_KeyboardとInputData_PC_Gamepadにアイコンを設定- image size を 32 に設定したが、小さくなりすぎる可能性があるので UI 側で変えた方がいいかもしれないらしい
- アイコンはアクションに割り当てられいてるのではなく、キーに割り当てられている。よってプラットフォームごとにアイコンを処理することができる
| InputData_PC_Keyboard | InputData_PC_Gamepad |
|---|---|
![]() |
![]() |
ControllerUIInputDataを継承した BP をDemoGameInputDataの名前で作成する- この時、
InputData_PC_KeyboardとInputData_PC_Gamepadの名前をそれぞれControllerData_PC_Keyboard,ControllerData_PC_Gamepadに変更している
- この時、
DemoGameInputDataは、ユニバーサルなクリックや戻るボタンのアクションを指定する。ここでの設定値は以下になる。- Project Settings -> Common Input Settings
- ここまででデータアセットの作成と設定は完了
- ここからスタイリングアセット
UIフォルダの下にStylingフォルダを作成- スタイルもデータアセット同様の形の設定になる
CommonBorderStyleを継承した BP をBorderStyle_DemoGameGenericBorderという名前で作成するStyleで検索するとスタイル用のアセットのバリエーションが見れる
CommonButtonStyleを継承した BP をButtonStyle_DemoGameGenericButtonという名前で作成するCommonTextStyleを継承した BP をTextStyle_DemoGameGenericMenuTextという名前で作成する- Text を例にした簡単なスタイリングの仕組みの紹介
CommonTextStyleは簡単には、既存の Widget のTextにおけるAppearanceを外に出す仕組み- なので以下のように
CommonTextStyleの継承クラスの設定も似ている - ただ、既存の
TextWidget には設定できず、そのためにCommonTextWidget が存在する
Common Textの箇所で作成したスタイルアセットを指定できるだけでなく、Appearanceで override もできる
- Project Settings -> Plugins -> Common UI Editor でグローバルに設定も可能

- 最も多く使われるスタイルがあればここに設定しておくと便利
CommonActivatabeWidgetを継承した BP をUI_Baseという名前で作成する- Common Activatable Widget Stack
- メニュースタックの作成を可能にするもの
- スタックの仕組みを意識せずに特定の方式でメニューを追加できる
- Common Activatable Widget Queue もあるが、こちらはあまり使わない
- overlay の下に 2 つの Common Activatable Widget Stack を配置
- Common Activatable Widget を継承して、
UI_MainMenuを作成 - ボタンのスタイル(忘れていたらしい)
- ボタンの構造
- 文字列の説明とローカライズ
- ボタンの設定

- 同じことは Construct でもできるが、Pre Construct にすることでエディタでも文字列を反映させることができる

- 最小サイズを設定し、エディタの表示サイズも Custom にして合わせておくと確認しやすい
- ボーダーのスタイル(忘れていたらしい)
- 単純な設定。今回は色だけ設定。

UI_MainMenuの作成- ざっくり以下のような構造。ボタンは当然
UI_Generic_Button。 
- ざっくり以下のような構造。ボタンは当然
- プレイヤーコントローラーの作成
- ゲームモードの作成
- 同フォルダに
FrontEndGameModeを作成 - 先ほどの Player Controller だけ設定し、ゲームモード自体も
DemoGameFrontEndマップに指定する
- 同フォルダに
- 動作確認
- メニューが表示され、ホバーやクリック時のボタン色の変更が見て取れる
- アクティブ化時にフォーカスを指定
UI_MainMenuはスタックに push された時点で Stack の最上位になるため、Activate される
Get Desired Focus Targetを override した上で利用する
- フォーカス指定が意図どおりにならない

- 上記のようにうっすらと枠がでるだけになる
- これは Project Settings で Desktop は Keyboard & Mouse がデフォルトになっているため
- これを Gamepad に変える
- こうすると、Gamepad で操作した場合は以下のようにアクティベート時にホバーされた色 (つまりフォーカスしている)になる
- ただ、Keyboard のみの操作の場合には、先程のうっすらとした枠(これがキーボードのフォーカスになっていると思われる)が出るだけで、ホバー色にならない
- 以下の設定がうっすらとした枠の設定になるが、それを Never にすると単に出なくなるだけになる(つまりキーボードでの操作の位置がわからなくなる)
- Prompt の作成
- Common Activatable Widget を継承して
UI_GenericPromptを作成 
CommonBorder,UI_Generic_Buttonを利用- 上下に配置した Spacer でボックスを中央に配置
- Common Activatable Widget を継承して
- 動作確認
- Quit Game クリックでプロンプトが表示され、Yes でゲーム終了を確認
- No の場合にはフォーカスが戻らない
- プロンプトが出ている場合にも、メニューはクリック可能
- フォーカス戻らない問題
UI_MainMenuのAuto Restore Focusを true にしても改善はしない- そもそも異なる Stack なので機能しない?(そもそも Deactivate していないので、再Activate 自体してない気も)
- 以下のように PromptStack から出て、Prompt が Deactivate された時に MainMenu Stack の先頭に無理やり Focus を戻す

- Prompt を MenuStack に入れた場合の挙動

- こうすることで、Prompt を出す (Quit Game をクリック) することでメニューが消えて、プロンプトが現れるという状態になる(
UI_MainMenuは Deactivate される) - フェードになるのは
MenuStackの以下の設定による - 戻しておく
- IsModal
- IsModal オプションについては、指定した Widget がどういう形式であろうと、入力のルートだとみなすようになる(らしい)
- Auto Activate など
- Common Activatable Widget を Stack 無しで生で利用する場合には Auto Activate や Is Focusable などを利用することがあるが、 Stack を利用する場合においては不要(デフォルトの off のままで良い)
- Common UI は Stack を利用して Transition 後に Activate/Deactivate されることを想定しているので、Auto Activate は off がデフォルトになっている
- Is Back Handler
- グローバルのバックボタンを Prompt で機能させたい
- Is Back Handler の指定だけでは機能しない
- Is Modal が必要になりそう
On Handle Back Actionを override し、そこで Deactivate させる
- Transition などのために直ちに Deactivate することはしない(らしい)
- 動作確認
- ここまでの操作でグローバルの Back キーでプロンプトが閉じるように(
EscorGamepad Face Right)
- ここまでの操作でグローバルの Back キーでプロンプトが閉じるように(
- アイコンの表示
CommonActionWidget_94 |
CommonActionWidget_194 |
|---|---|
![]() |
![]() |
Keyboard |
Gamepad |
|---|---|
![]() |
![]() |
- Project Settings の Gamepad Name のミス

- 上記が Windows になっていたので、アイコンが Gamepad 時に表示されなかった
- ここから
CommonBoundActionButtonの利用に入ったりしたが、クラッシュしたり質問コーナーに突入したりでよくわからなくなった。。 - Q&A
視聴してみて
- 機能別サンプルだと理解が深まらなかった Stack / Queue 周りのことが知れてよかった
- Canvas は使わない方がいいことは知らなかったので知れて良かった
- いくつか疑問点は残ったので、拾っていきたいしフォーラムも漁ってみたい























