わんころのUE5勉強会 Apr/28/2025 21:37

【UE5:検証】CommonUIとGame PadのFace Button Bottom(Aボタン)

皆様、こんばんは!

以前 X で検証した内容ですが、解決できずこんな仕様なんだというのが分かっただけの記事です。


▼ 以前色々試して撃沈した様子
https://x.com/UE5wancoro/status/1884024134549790825


この記事の内容

CommonUI + Input Key Selector を使ってキーコンフィグを実装しようとした時に、Face Button Bottom(以降Aボタン)がマウス左クリックとして扱われたのを検証していた時のお話です。


プロジェクト設定

CommonUI プラグインを有効にすると、プロジェクト設定の「GameViewportClientClassName(ゲームのビューポートクライアントクラス)」で "CommonGameViewportClient" を選択できます。

以降はこの設定にしてる場合の Input Key Selector の挙動です。


UE5.6 ならコンソールコマンドで切替え可

UE5.6 でコンソールコマンドが追加されました。
https://x.com/UE5wancoro/status/1929923983388094915

コンソールコマンドにて
「CommonUI.ShouldVirtualAcceptSimulateMouseButton 0」で Aボタンを A ボタンとして扱えるようになります。
1 にすると従来通り、A ボタンを左クリックとして扱います。


どういう挙動なのか


UI 作成時に "Common User Widget" を親にし、
Canvas Panel, Input Key Selector を配置しました。


ゲームパッドで A, B, X, Y ボタンを押した動画です。
分かりづらいですが Aボタンの部分が「マウスの左ボタン」となっています。


Aボタンが左クリックとして扱われる

CommonUI の入力等に関しては 入力技術ガイド に色々書いてありました。

一部抜粋:
FCommonAnalogCursor では、現在のウィジェットで 結合アクション によってキャプチャされていないゲームパッド上の標準的な「Accept」アクションの入力は処理しません。代わりに、その入力が FAnalogCursor::HandleKeyDownEvent に送信されて、FAnalogCursor によって FSlateApplication で処理する合成マウス クリック イベントが作成されます。
この時点で、このマウス イベントは通常のクリックと同じような入力処理プロセスを経て、最終的なクリックをトリガーします。

自分には難しい内容だったので誤った解釈をしている可能性はありますが、ゲームパッド操作時に内部的にマウスカーソルで操作してるような動きに置き換えられているので、Hovered や Clicked イベントが利用できるのかなと思いました。

また、ゲームパッド上の標準的な「Accept」というのがAボタンのことなら、Input Key Selector でAボタンを押すと通常のクリック(左クリック)として扱われるという説明に納得できます。


特定の操作時はAボタンとして扱われる


この動画は Input Key Selector を先にマウスでクリックして入力受付状態にし、ゲームパッドでAボタンを押した時の挙動です。

この場合はAボタンとして扱われるようです。
ゲームパッドで Accept(Aボタン) を利用しなかったので、通常のゲームパッドとして認識されたのかなと思いました。

また、Input Key Selector の On Key Selected イベント時に入力されたキーの種類を判別する Blueprint も作成し、入力がマウスであることも確認出来ました。


※ チェック用の処理


ちなみに Common Input Subsystem> Get Current Input Type の方で確認すると GamePad と表示されます。

この結果で、Input Key Selector 選択時はゲームパッド入力の判断が出来ていて、内部でマウスイベントに置き換えられているということが分かりました。

なるほど~とは思いましたがAボタンで返ってきて欲しかったんですよね...


条件はわかっているので処理はできる

https://x.com/UE5wancoro/status/1924845663084597401

画像は X の方に載せていますが、
Common Input Subsystem> Get Current Input Type が Gamepad の場合かつ、Input Key Selector で得た入力がマウスの左ボタンだった場合、Gamepad の A ボタンと判断することが出来ます。

下記記載の C++ ならなんとか出来るかもしれませんが、私はわからないので UE5.5 以下の場合はこの方法でもいいかなと思いました。


C++ を使えば回避できるかも?

私はこの時点でお手上げだったので解決はできませんでした。
UE5.4 以降ならこういう方法があるそうです。

https://forums.unrealengine.com/t/why-does-left-mouse-click-register-when-i-press-gamepad-face-button-bottom-on-gamepad/1809814/3


他の機能で代用しようか検討中

CommonUI を使うとボタンやスライダ含め、ゲームパッドでのUIナビゲーションに利用できそうでいいな~と思ってたんですが、ゲーム制作にキーコンフィグを入れようと確認していた時にこの内容にぶつかってしまったのが今回の経緯でした。

プロジェクト設定で "GameViewportClient" にしていればこの挙動は発生しなかったので CommonUI をやめて UI Navigation 3.0 を代わりに使う方法も検証してたのですが、エディタが高頻度で落ちるようになったのでやむなく断念しました。

代わりにボタン+テキストの構成で、キー入力があったらキーの名前をテキストにセットしてそれっぽく見せる方法でどうにか出来ないかなと考えています。

キー入力の取得やキーコンフィグは Enhanced Input User Settings を使って色々検証出来ているので UI のナビゲーションが出来れば行けそうな気はしています(フラグ)


最後に

やっぱり UI 周りかなり難しいなと感じますね...
もうそろそろ UE5.6 もリリースになると思いますが何かしらアップデートがあると嬉しいですね。

UE5.6 の新テンプレートも結構楽しみにしています。


それではまた!

If you liked this article, support the creator with a tip!

Sending tips requires user registration.Find details about tips here.

Search by Article Tags

Monthly Archive

Search by Exclusive Perks

Search Articles