わんころのUE5勉強会 Aug/11/2024 22:36

【UE5.3】Enhanced Input User Settingsという新しい仕組み

皆様、こんばんは!

今回は UE5.3 で登場した「Enhanced Input User Settings」についてどういうものか触れてみたという記事です。5月頃に下書きを保存して放置していたため公開しました。

※ 分からないなりに検証したものなので間違ったことが書かれている可能性があります

Enhanced Input User Settings とは

Enhanced Input に加わった新しい仕組みです。主にキーコンフィグで利用する事になると思いますが以前と比べ扱いやすくなっています。



この機能は以前 Player Mappable Input Config(以降頭文字を取って PMIC) を使って操作していました。

このアセットに Input Mapping Context(IMC) を登録しておき、キーコンフィグで利用するキー情報を取得する時に使われてましたが UE5.3 で非推奨になり、代わりに「Enhanced Input User Settings」を使うよう仕様変更がありました。

それに伴い「Add Player Mappable Config」などの PMIC に関わる関数が廃止されたようです。
(AddPlayerMappableConfig has been deprecated, please use UEnhancedInputUserSettings instead. という記載が見つかりました)


Enhanced Input User Settings を利用する前に


この機能を利用するには「プロジェクト設定」>「Enhanced Input」 の中にある "ユーザー設定を有効化(実験段階)" にチェックを入れる必要があります。(この機能は執筆時点で実験段階のため今後に注意)


「Enhanced Input Local Player Subsystem」から「Get Enhanced Input User Settings」を出すことで利用できますが、上記の "ユーザー設定を有効化(実験段階)" にチェックが入ってないと戻り値が無効な値になります。

「Get Enhanced Input User Settings」から "拡張入力>ユーザ設定" のカテゴリを見ると利用できる関数一覧が表示されます。


Register Input Mapping Context で IMC を登録


「Get Enhanced Input User Settings」から引っ張り「Register Input Mapping Context」「Register Input Mapping Contexts」という二つの関数があります。

どの IMC を利用するのかを Enhanced Input User Settings に教える(登録する)関数のようです。

Contexts の複数形の方は IMC を Set で指定することが出来るのでまとめて登録する場合はこちらを利用します。



これに伴い「Add Mapping Context」に若干仕様変更がされています。
「Add Mapping Context」の構造体ピンを分割(もしくは Modify Context Options を作成)すると現れる "Notify User Settings" のフラグです。

これにチェックを入れておくと「Add Mapping Context」で指定した IMC を「Register Input Mapping Context」もしてくれるので少し楽が出来ます。キーコンフィグで使われる IMC ならチェックを入れておくといいと思います。

※「Add Mapping Context」時、明示的に "Notify User Settings" のフラグをチェックしておかないと自動で登録してくれないので注意

「Add Mapping Context」はしたいけどまだ登録はしなくていい場合はチェックを外しておき、必要なタイミングで「Register Input Mapping Context」を呼べば大丈夫です。



「Remove Mapping Context」も同じで Options ピンを分割すると "Notify User Settings" のフラグがあります。
このフラグにチェックを入れておくと指定の IMC を外す(Remove)時に「Unregister Input Mapping Context」してくれます。
こっちは登録解除の通知をするために使います。

※「Remove Mapping Context」時、明示的に "Notify User Settings" のフラグをチェックしておかないと自動で登録解除してくれないので注意



指定の IMC が登録されているかを調べるには「Is Mapping Context Registered」を使います。関数を見た感じ複数個調べる関数はなさそうでしたので1個ずつ調べる必要がありそうです。

キーコンフィグしたいキーを設定する


IMC で設定した IA_Jump を例に見てみます。
UE5.1 では "Is Player Mappable" のチェックを入れて編集していた項目が新しくなっています。
※ UE5.2 でこの仕様に変わってた気がしますが、容量の関係で UE5.2 がないため正確でない可能性あり

"Setting Behavior" を [Override Settings] に変更します。
次に "Player Mappable Key Settings" を [Player Mappable Key Settings(Experimental)] に変更することで以前のような入力画面が展開されます。

最低限 "名前" があれば良さそうです。
"名前" は主に Blueprint などでアクセスします。この名前と一致したものを別のキーに置き換える時に利用します。
試しに 名前:KB_Jump としました。


名前:KB_Jump を取得してみる


Enhanced Input の Subsystem から「Get Enhanced Input User Settings」> 「Get Current Key Profile」> 「Get Player Mapping Rows」と呼びます。

「Get Player Mapping Rows」の戻り値は Name型が Key/Key Mapping Row構造体がValueのマップです。

画像では「For Each Loop」を使って "名前" の所を全て出力しています。今回の例では KB_Jump しか出力されませんが、上記 [Player Mappable Key Settings(Experimental)] で設定したキーが他にもあれば全て出力されます。


「Map Player Key」を使ってキーコンフィグ

「Get Enhanced Input User Settings」から引っ張り「Map Player Key」を出します。画像は "In Args" を分割して表示したものです。

Map Player Key Args構造体になっており、いくつかのプロパティが表示されます。今回は下記三つを触っています。

"Mapping Name" にキーコンフィグする名前を指定します。
先程 IMC で指定した "名前"「KB_Jump」になります。

"New Key" に新しいキーを割り当てます。
直にマウス右クリックを指定しましたが、本来は UI と連動したキーコンフィグを想定しているはずなのでユーザが入力したキーをここに接続すれば良さそうです。このピンは Key構造体 になってます。

"Slot" は [First] を指定しました。最初に見つかったスロット(恐らく名前?)を "New Key" に置き換えます。

これでプレイするとスペースキーでのジャンプはできず、右クリックでジャンプが出来るようになります。キーコンフィグがめっちゃ簡単に扱えるようになりましたね。


気になったので [Unspecified] や [Second] など指定してみました。
“Create Matching Slot if Needed" のフラグが ON か OFF で挙動が変わります。

ON の場合、スペースキーでも右クリックでもジャンプしました。
恐らく一致したスロットがなかったので新しくスロットが作成され、右クリックでも反応するようになったのだと思います。
(後述の「On Settings Changed」が発行された事も確認)

OFF の場合、一致するスロットが見つからなかったのでキーの変更は行われませんでした。
(後述の「On Settings Changed」は発行されませんでした)



「Apply Settings」と「Save Settings」

もう一度プレイし直すとスペースキーでジャンプするデフォルトの挙動に戻ります。以前はユーザが入力したキー情報は SaveGameObject を使って保存したり工夫が必要でした。

...が、なんと関数が用意されました。


先程の「Map Player Key」でキーコンフィグ後、「Get Enhanced Input User Settings」>「Save Settings」を呼ぶだけです。ゲームを再起動しても新しいキーで置き換わっているのでめっちゃ楽になりました。(今までのは一体...)

画像には別の関数「Apply Settings」を載せてますが、この関数を呼ばなくても「Save Settings」だけでもセーブはできてました。
(一応「Apply Settings」を呼んでから「Save Settings」しておいた方がいいかも?)



「Apply Settings」が呼ばれると「On Settings Applied」というイベントが発行されるようなので、バインド先の処理にキーコンフィグを適用した瞬間に何か処理したい場合は利用できそうです。


「Map Player Key」を呼んでキーの変更が出来た、もしくは新しいキー(スロット)が追加された場合は「On Settings Changed」というイベントが発行されるようなので、キーを置き換えた瞬間に何か処理したい場合は利用できそうです。
例えば重複したキーがありますとかそういう事ができそうですね。

ちなみに「Save Settings」を呼んでも上記二つのイベントは発行されないようでした。


セーブファイルはどうなってる?

「Save Settings」を呼んだ時にセーブファイルが所定の場所に保存されてました。

エディタ起動:プロジェクトフォルダ/Saved/SaveGames 内
パッケージ化:実行ファイルの場所/Saved/SaveGames 内

に "EnhancedInputUserSettings.sav" というファイルが作成されるようです。


「Map Player Key」の罠

「Map Player Key」の "New Key" の指定で気をつける点があります。
元のキーが "キーボード&マウス" の場合、置き換えるキーも "キーボード&マウス" にしないと変更されないようです("ゲームパッド" なら "ゲームパッド" に)

https://twitter.com/kuriemeiku/status/1783351810759295164

九里江めいくさん、あらんさんにて色々な情報を頂けました!本当にありがとうございます!

また、あらんさんより C++ でこの問題を回避する方法を教えて頂きました!

https://twitter.com/thearan8000/status/1783444436309225570

最後に

仕様がコロコロ変わる Enhanced Input ですが、今回の機能はまだ実験段階のためまた変わる可能性があります。

やっぱり難しいですが、キーコンフィグの実装が簡単になってるのでこれは今後にも期待ですね(白目)

それではまた!

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