【UE5.3】Enhanced Input User Settingsという新しい仕組み
皆様、こんばんは!
今回は UE5.3 で登場した「Enhanced Input User Settings」についてどういうものか触れてみたという記事です。
記事内は UE5.3 で検証したあれこれをまとめたものです。
※ 分からないなりに検証したものなので間違ったことが書かれている可能性があります
● 2025-01-22:目次に関数名を表記しました
● 2025-01-23:「KeyProfile という仕組み」「Reset Key Profile to Default」「Get Mapped Keys in Row」「Get Mapping Names for Key」「Get Profile Identifer」を追加
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」 の中にある "ユーザー設定を有効化(実験段階)" にチェックを入れる必要があります。(この機能は執筆時点で実験段階のため今後に注意)
2024-11-29 追記:UE5.5 で正式に対応したようです!
「Enhanced Input Local Player Subsystem」から「Get Enhanced Input User Settings」を出すことで利用できますが、上記の "ユーザー設定を有効化(実験段階)" にチェックが入ってないと戻り値が無効な値になります。
「Get Enhanced Input User Settings」から "拡張入力>ユーザ設定" のカテゴリを見ると利用できる関数一覧が表示されます。
KeyProfile という仕組み
Enhanced Input User Settings を使うにあたりキープロファイルという単語が出てきます。例えばキャラの移動やカメラ、攻撃など色々なキーがゲームで使われますが、こういったキー情報をまとめてあるものがキープロファイルと呼ばれているようです。
先程の画像ですが、黄色枠の下に「デフォルトプレイヤーのマッピング可能なキープロファイルクラス」という項目があります。
ここは "EnhancedPlayerMappableKeyProfile" が指定されています。
(プルダウンをクリックしてもこれしか選べないと思います)
UE で用意されているデフォルトのキープロファイルが "EnhancedPlayerMappableKeyProfile" ということになります。
ゲーム内で適用できるキープロファイルは1つだけですが、キープロファイル自体は Gameplay Tag と紐づけることで複数作成も可能で、ゲーム内で切り替えるようなことも可能です。
通常のゲームであればほとんどの場合1つあれば問題ないため、必要なら各自で作成してくださいということだと思います。
複数のキープロファイルを利用するのはどんな時だろうと思い「キャラ毎にキーコンフィグ」とGoogleで調べてみると オーバーウォッチ2、ヴァロラントというゲームがヒットしました。
このゲームはキャラ毎にキーの割り当てが出来るようで、例えばスキルを使うボタンをキャラ毎に変えるとか、そういう使い分けが出来るようです。
(キャラ1を選択すると KeyProfileA、キャラ2を選択するとKeyProfileB に切り替える)
先程 Gameplay Tag と紐づけると記載しましたが、デフォルトの "EnhancedPlayerMappableKeyProfile" では "InputUserSettings.Profiles.Default" の Tag で紐づいてるようでした。
例えば後述の「Reset Key Profile to Default」では "Profile Id" という Gameplay Tag を引数で指定する必要があり、ここに "InputUserSettings.Profiles.Default" を指定することで、対応したキープロファイル(この場合はデフォルトのキープロファイル)のキーコンフィグをリセットすることが可能です。
大雑把にまとめると、キーコンフィグの情報を持つのにデフォルトで用意されているキープロファイル(EnhancedPlayerMappableKeyProfile)があって、それが "InputUserSettings.Profiles.Default" という Gameplay Tag と紐づいている。
上記のようなゲームでない限りプロファイルは1つでいいのでデフォルトのまま使えば問題ないということになりますかね。
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 をセットで指定することが出来るのでまとめて登録する場合はこちらを利用します。
これに伴い「Add Mapping Context」「Remove Mapping Context」で利用されている Options(Modify Context Options 構造体)に若干仕様変更がされています。
Options ピンを分割(もしくは 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」を呼べば大丈夫です。
「Add Mapping Context」してなくても「Register Input Mapping Context」で登録だけすることも可能なので、Remove 状態の IMC もキーコンフィグすることが出来ます。(キーコンフィグ方法は後述の「Map Player Key」に記載しています)
キーコンフィグ後に「Add Mapping Context」すると置き換えたキーが反映していたので結構柔軟に対応できるなという印象でした。
「Remove Mapping Context」も同じで Options ピンを分割すると "Notify User Settings" のフラグがあります。
このフラグにチェックを入れておくと指定の IMC を外す(Remove)時に後述の「Unregister Input Mapping Context」してくれます。
こっちは登録解除の通知をするために使います。
※「Remove Mapping Context」時、明示的に "Notify User Settings" のフラグをチェックしておかないと自動で登録解除してくれないので注意
Unregister Input Mapping Context で登録解除
Register で登録するのに対し、Unregister は登録解除するための関数です。こちらも Register 同様単品版と複数版に分かれています。
Register されるタイミングは「Add Mapping Context」の Options ピンにて "Notify User Settings" を ON 、または「Register Input Mapping Context」を利用した時ですが、この2つの関数は登録したものを解除する時に使います。
Register する時は主にキーコンフィグで利用する IMC になると思いますが、なにかのタイミングでキーコンフィグから除外したい時に利用できそうです。
Unregister したからといってキーコンフィグの情報がデフォルトのキーにリセットされるということはありません。
「Add Mapping Context」された IMC を全て削除できる「Clear All Mappings」のように、Register された IMC を全て Unregister する関数は見当たりませんでした。
ゲーム内でキーコンフィグ可能なキーは恐らく決まってると思うので、事前に Register してるだけで十分では?と感じました。
そのため Unregister したいタイミングがイメージできなかったので、何かいい例があれば教えて欲しいです;
Register/Unregister と Add/Remove の注意点
少しややこしいですが IMC を実際の入力として利用するために用いる「Add Mapping Context」と「Remove Mapping Context」とは役割が違う点に注意です。
「Add Mapping Context」「Remove Mapping Context」の Options からは Register/Unregister するか決めれますが、「Register Input Mapping Context(s)」/「Unregister Input Mapping Context(s)」からは「Add Mapping Context」や「Remove Mapping Context」できません。
Register/Unregister 時の注意点
「Register Input Mapping Context」「Unregister Input Mapping Context」の戻り値である "Return Value" で登録/登録解除されたか調べることができます。
Register の方は、登録が初めての場合 True を返し、2回目以降(Unregister されるまで)は False を示しました。
既に登録済みなので~という見方が出来ます。
しかし Unregister の方は呼ばれる度に True を返していました。
既に登録解除されてるので~という意味で2回目以降は False を示すのかなと思ってたのでこれは予想外でした。
そんなに気にしなくてもいいかもしれませんが念のため書いておきました。
Is Mapping Context Registered で Register された IMC を確認
指定の IMC が登録されているかを調べるには「Is Mapping Context Registered」を使います。関数を見た感じ複数個調べる関数はなさそうなので1個ずつ調べる必要がありそうです。
似たようなもので「Has Mapping Context」がありますが、これも役割が違うため注意が必要です。
(こっちは「Add Mapping Context」された IMC をチェックする関数です)
IMC 内でキーコンフィグしたいキーを設定する
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 としました。
Get Player Mapping Rows で 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 を使ってキーコンフィグ
前述の「Register Input Mapping Context」で登録された IMC に対し、Name で指定した名前と一致するキーを置き換える時に利用する関数です。要するにキーコンフィグを行うメインの関数です。
「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" に置き換えます。
これでプレイするとスペースキーでのジャンプはできず、右クリックでジャンプが出来るようになります。キーコンフィグがめっちゃ簡単に扱えるようになりましたね。
気になったので "Slot" のプルダウンで選択できる [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
Reset Key Profile to Default でキーコンフィグをリセット
前述の「Register Input Mapping Context」で登録された IMC に対し、「Map Player Key」を使ってキーコンフィグしたものをデフォルトにリセットすることができます。リセットが関数1つで出来るのはかなり便利です。
リセット対象はこの画像の "Profile Id" で指定したキープロファイルになりますが、"Profile Id" という引数は "Gameplay Tag 構造体(リファレンス)" となっており、"Profile Id" に何か繋がないとエラーになります。
本記事の見出しの1つ KeyProfile という仕組み でも触れしましたが、デフォルトのキープロファイルは "InputUserSettings.Profiles.Default" という Gameplay Tag に紐づいているので、デフォルトのまま利用している場合はこの画像のように繋ぐか、後述の「Get Profile Identifer」を繋ぐといいかなと思います。
Get Mapped Keys in Row で名前からキーを取得
前述の「Register Input Mapping Context」で登録された IMC に対し、"Mapping Name" に指定した名前から割り当たっているキーを取得できる関数です。戻り値は "Key 構造体の配列" となっています。
この画像では "Mapping Name" に KB_Jump を指定しているため、ジャンプに割り当てたスペースキーが取得できます。
(KB_Jump の設定は IMC 内でキーコンフィグしたいキーを設定する を参照下さい)
Get Mapping Names for Key でキーから名前を取得
前述の「Register Input Mapping Context」で登録された IMC に対し、"In Key" で指定したキーと一致する名前を取得します。
今回の例では "In Key" にスペースキーを指定しているので KB_Jump が取得できます。もし他のキーでスペースキーを指定している場合はその名前も取得できます。
(KB_Jump の設定は IMC 内でキーコンフィグしたいキーを設定する を参照下さい)
Get Profile Identifer で現在のキープロファイルIDを取得
「Enhanced Input User Settings」を有効すればデフォルトで "EnhancedPlayerMappableKeyProfile" というキープロファイルが利用可能です。
このキープロファイルには Gampley Tag が紐づいていることは KeyProfile という仕組み に記載しました。
この関数はその Gameplay Tag を取得する関数で、デフォルトの場合は「InputUserSettings.Profiles.Default」が出力されます。
もし別のキープロファイルを作った場合は、上記と別の Gameplay Tag が紐づくのでそれが取得できます。
最後に
仕様がコロコロ変わる Enhanced Input ですが、今回の機能はまだ実験段階のためまた変わる可能性があります。
やっぱり難しいですが、キーコンフィグの実装が簡単になってるのでこれは今後にも期待ですね(白目)
それではまた!