概要
CommonUIプラグインの ActivatableWidget の入力が反応する状態をまとめました。
設定が多く組み合わせと操作デバイスの切替によって反応が変わります。
検証環境
UE5.8.1
PIE再生環境
ウィジェット構成
WBP_BoundActionButton
CommonBoundActionButton継承
InputActionTriggerに任意のキーを指定
ここではWキーとゲームパッドFaceButtonTop(XboxならYボタン)を割り当て。OnClickedでログ出力
WBP_ActivatableWidget
CommonActivatableWidget継承
WBP_BoundActionButtonを内包
WBP_All
WBP_ActivatableWidgetを4つ入れた状態
Activate状態とVisiblity状態の組み合わせ
| ActivatableWidget | Activate | Visiblity |
|---|---|---|
| 1 | Activate | Visible |
| 2 | Activate | NotHittestable(Self&Children) |
| 3 | Deactivate | Visible |
| 4 | Deactivate | NotHittestable(Self&Children) |
検証内容
BlueprintのActorをレベルに追加し、ActorのBeginplayでWBP_AllをCreateWidgetし、AddToViewportをする
GameViewportClientClass CommonGameViewportClientを指定
入力の反応は以下の状態の時に調査
- PIE再生直後
- UI上のボタンを押した時
- マウスをビューポートにキャプチャした時
- ゲームパッドの操作をした後
で結果をまとめる
1. 初期状態
UIの反応
| WBP | マウスクリック | InputActionTrigger | フォーカス移動(キーボード) | フォーカス移動(ゲームパッド) |
|---|---|---|---|---|
| Acticate&Visible | 反応する | 反応する | 反応する | 反応する |
| Activate&NotHittestable | 反応しない | 反応しない | 反応しない | 反応しない |
| Deactivate&Visible | 反応する | 反応しない | 反応する | 反応する |
| Deactivate&NotHittestable | 反応しない | 反応しない | 反応しない | 反応しない |
WASD/スティックによるプレイヤー操作
| マウスのViewportキャプチャ | WASD移動 | マウスカメラ向き | スティック移動 | スティックカメラ向き |
|---|---|---|---|---|
| キャプチャしない | 反応しない | 反応しない | 反応しない | 反応しない |
| UIボタン押下後 | ASDのみ反応する。Wは押し続けると反応する | 反応しない | 反応しない | 反応しない |
| キャプチャする | ASDのみ移動する。Wは推し続けると移動する | 反応する | 反応しない | 反応しない |
| キャプチャ後にパッド操作切替後(再キャプチャ不可) | 反応しない | 反応しない | 反応しない | 反応しない |
2. InputModeをMenuにする
UIの反応
| WBP | マウスクリック | InputActionTrigger | フォーカス移動(キーボード) | フォーカス移動(ゲームパッド) |
|---|---|---|---|---|
| Acticate&Visible | 反応する | 反応する | 反応する | 反応する |
| Activate&NotHittestable | 反応しない | 反応しない | 反応しない | 反応しない |
| Deactivate&Visible | 反応する | 反応しない | 反応する | 反応する |
| Deactivate&NotHittestable | 反応しない | 反応しない | 反応しない | 反応しない |
WASD/スティックによるプレイヤー操作
| マウスのViewportキャプチャ | WASD移動 | マウスカメラ向き | スティック移動 | スティックカメラ向き |
|---|---|---|---|---|
| キャプチャしない | 反応しない | 反応しない | 反応しない | 反応しない |
| UIボタン押下後 | ASDのみ反応する。Wは押し続けると反応する | 反応しない | 反応しない | 反応しない |
| キャプチャする | ASDのみ移動する。Wは押し続けると移動する | 反応する | 反応しない | 反応しない |
| キャプチャ後にパッド操作切替後(再キャプチャ不可) | 反応しない | 反応しない | 反応しない | 反応しない |
IgnoreMoveInput,IgnoreLookInputを有効
| マウスのViewportキャプチャ | WASD移動 | マウスカメラ向き | スティック移動 | スティックカメラ向き |
|---|---|---|---|---|
| キャプチャしない | 反応しない | 反応しない | 反応しない | 反応しない |
| UIボタン押下後 | ASDのみ反応する。Wは押し続けると反応する | 反応しない | 反応しない | 反応しない |
| キャプチャする | ASDのみ移動する。Wは押し続けると移動する | 反応する | 反応しない | 反応しない |
| キャプチャ後にパッド操作切替後(再キャプチャ不可) | 反応しない | 反応しない | 反応しない | 反応しない |
3. InputModeをGameにする
UIの反応
| WBP | マウスクリック | InputActionTrigger | フォーカス移動(キーボード) | フォーカス移動(ゲームパッド) |
|---|---|---|---|---|
| Acticate&Visible | 反応する | キーボードのみ反応する。パッド操作切替後反応しない | 反応する | 反応する |
| Activate&NotHittestable | 反応しない | 反応しない | 反応しない | 反応しない |
| Deactivate&Visible | 反応する | 反応しない | 反応する | 反応する |
| Deactivate&NotHittestable | 反応しない | 反応しない | 反応しない | 反応しない |
WASD/スティックによるプレイヤー操作
| マウスのViewportキャプチャ | WASD移動 | マウスカメラ向き | スティック移動 | スティックカメラ向き |
|---|---|---|---|---|
| キャプチャしない | 反応しない | 反応しない | 反応しない | 反応しない |
| キャプチャする | ASDのみ移動する。Wは押し続けると移動する | 反応する | 反応する | 反応する |
| キャプチャ後にパッド操作切替後(再キャプチャ不可) | 反応する | 反応しない | 反応する | 反応する |
IgnoreMoveInput,IgnoreLookInputを有効
| マウスのViewportキャプチャ | WASD移動 | マウスカメラ向き | スティック移動 | スティックカメラ向き |
|---|---|---|---|---|
| キャプチャしない | 反応しない | 反応しない | 反応しない | 反応しない |
| UIボタン押下後 | ASDのみ反応する。Wは押し続けると反応する | 反応しない | 反応しない | 反応しない |
| キャプチャする | ASDのみ移動する。Wは押し続けると移動する | 反応する | 反応しない | 反応しない |
| キャプチャ後にパッド操作切替後(再キャプチャ不可) | 反応しない | 反応しない | 反応しない | 反応しない |
4. InputModeをAllにする
UIの反応
| WBP | マウスクリック | InputActionTrigger | フォーカス移動(キーボード) | フォーカス移動(ゲームパッド) |
|---|---|---|---|---|
| Acticate&Visible | 反応する | 反応する | 反応する | 反応する |
| Activate&NotHittestable | 反応しない | 反応しない | 反応しない | 反応しない |
| Deactivate&Visible | 反応する | 反応しない | 反応する | 反応する |
| Deactivate&NotHittestable | 反応しない | 反応しない | 反応しない | 反応しない |
WASD/スティックによるプレイヤー操作
| マウスのViewportキャプチャ | WASD移動 | マウスカメラ向き | スティック移動 | スティックカメラ向き |
|---|---|---|---|---|
| キャプチャしない | 反応しない | 反応しない | 反応しない | 反応しない |
| UIボタン押下後 | ASDのみ反応する。Wは押し続けると反応する | 反応しない | 反応しない | 反応する |
| キャプチャする | ASDのみ移動する。Wは推し続けると移動する | 反応する | 反応する | 反応する |
| キャプチャ後にパッド操作切替後(再キャプチャ不可) | ASDのみ移動する。Wは押し続けると移動する | 反応しない | 反応する | 反応する |
IgnoreMoveInput,IgnoreLookInputを有効
| マウスのViewportキャプチャ | WASD移動 | マウスカメラ向き | スティック移動 | スティックカメラ向き |
|---|---|---|---|---|
| キャプチャしない | 反応しない | 反応しない | 反応しない | 反応しない |
| UIボタン押下後 | ASDのみ反応する。Wは押し続けると反応する | 反応しない | 反応しない | 反応しない |
| キャプチャする | ASDのみ移動する。Wは推し続けると移動する | 反応する | 反応しない | 反応しない |
| キャプチャ後にパッド操作切替後(再キャプチャ不可) | 反応しない | 反応しない | 反応しない | 反応しない |
InputActionTriggerの例外
DPad-Up/Down/Left/Rightはフォーカスされている場合はナビゲーションが優先される。
InputActionTriggerに設定しても反応しない。
フォーカスしていないなら反応する。
検証内容の補足
レベルブループリントで特定のキー入力後にWBP_AllをCreateWidgetし、AddToViewportをする。
GameViewportClientClass CommonGameViewportClientを指定
この場合は、キャプチャ後にパッド操作切替の結果と同じになる。
キー入力をするために、ビューポートをクリックしてマウスをキャプチャしてからの操作になる。
ActivatableWidgetをどう使うべきか
ボタン入力に対する反応を見ると、InputActionTriggerについてはActivate時のみ有効なものです。
一方マウスクリックについてはDeactivateでも反応してしまいました。
多くの場合は、Deactivate時にはNotHitTestable にすることで別のUIに操作が反応してしまう事故を防げるでしょう。
ゲームの入力を止めたい場合
GetDesiredInputConfig でInputModeをMenuにすると、ゲーム側の入力を止めてくれます。
多くの場合はこちらでいいでしょう。
リアルタイムな動作をしたい場合
HUD的な要素で入力を受け取って表示を更新するような場合、InputModeをAllにしてUI側で入力処理も込みで実装するといいでしょう。
Allにしておくと入力の仕様変更があるたびにゲーム側を変更する必要がなくなり、UI側だけで完結できそうです。
InputModeをGameにしてゲーム側に処理してもらうこともありますが、それなら通常のUserWidgetで作成するのが余分な機能もなくていいと思います
所感
ActivateしてInputModeをMenuにしたといっても、ゲーム側の入力を防ぐわけではないのが混乱するところに思います。
Deactivateであっても、マウスクリックは反応する、ナビゲーションにも反応する。
Deactivateで完全に反応させたくないならNotHitTestable(Self&Children)にする が重要な点です。
Disabledのフラグもあるのでそちらを使ってもいいでしょう。
個人的にはDeactivateは入力を受け付けないと一括管理するのがわかりやすいのではないかと思います。
Disabledはリストなどで並べて表示しているが使えない状態に使うべきかなと思います。
PIE環境の場合、再生直後、UI上のボタンを押した時、ビューポートへのキャプチャ、パッド操作の切替でプレイヤー操作の反応が色々変わってしまいます。
WASD移動はエディタ上の移動操作が優先されて残っているように思います。
キーボードマウス操作前提のゲームの場合に、PIE中ではUIを開いたのにゲーム側の操作ができるという挙動になって混乱しそうです。
