ビデオ
視聴しつつのコード
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
の継承クラスの設定も似ている - ただ、既存の
Text
Widget には設定できず、そのためにCommonText
Widget が存在する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 キーでプロンプトが閉じるように(
Esc
orGamepad Face Right
)
- ここまでの操作でグローバルの Back キーでプロンプトが閉じるように(
- アイコンの表示
CommonActionWidget_94 |
CommonActionWidget_194 |
---|---|
Keyboard |
Gamepad |
---|---|
- Project Settings の Gamepad Name のミス
- 上記が Windows になっていたので、アイコンが Gamepad 時に表示されなかった
- ここから
CommonBoundActionButton
の利用に入ったりしたが、クラッシュしたり質問コーナーに突入したりでよくわからなくなった。。 - Q&A
視聴してみて
- 機能別サンプルだと理解が深まらなかった Stack / Queue 周りのことが知れてよかった
- Canvas は使わない方がいいことは知らなかったので知れて良かった
- いくつか疑問点は残ったので、拾っていきたいしフォーラムも漁ってみたい