「ジャンプはSpaceよりJのほうが押しやすい」。プレイヤーがそう感じたとき、自分でキーを変えられるのがキーコンフィグです。割り当てを変えることを、リバインドとも呼びます。
設定画面でキー名が変わるだけでは、まだ完成ではありません。画面を閉じたら新しいキーで跳べること、ゲームを起動し直しても選んだキーが残ることまで、ひと続きの機能として作ります。
この記事では、ジャンプのSpaceをJへ変える設定画面を題材にします。まず1行を動かしてから、自分のゲームの操作へ広げましょう。
この記事でわかること
- 初期割り当てと、プレイヤーが変えた割り当ての関係
- 変更対象をUser Settingsへ登録する理由
- 押されたキーの取得、割り当ての変更、現在のキーの表示
- 変更の保存、キャンセル、初期値へ戻す流れ
初期割り当ての上に、プレイヤーの変更を重ねる
Enhanced Inputでは、Input Action(IA)が「ジャンプ」という操作、Input Mapping Context(IMC)が「Spaceでジャンプする」という割り当てを持ちます。
ここへ、Enhanced Input User Settingsというプレイヤーの設定を加えます。開発者が決めたSpaceは初期値として残し、プレイヤーが選んだJを上書きとして持たせます。元の表へ、変更用の付箋を重ねるイメージです。
| 担当 | 今回、覚えること |
|---|---|
| IA_PracticeJump | ジャンプという操作 |
| IMC_PlayerControls | 初期割り当てはSpace |
| User Settings | このプレイヤーはJを使う |
ジャンプを実行するBlueprintは、引き続きIA_PracticeJumpを受けます。キーを変えるたびに、Jumpノードの接続を変える必要はありません。

この分担を作っておくと、「プレイヤーの変更を保存する」「初期値へ戻す」という処理も、ジャンプの動きから分けて扱えます。
練習の準備と、変更する行の登録
UE5.3以降のEnhanced Input User Settingsを使います。Blueprintの変数と関数、UMGで部品を置く基本操作を知っている人向けです。
Enhanced Inputの入門記事で作った練習用プロジェクトを続けて使います。次の状態を確認してください。
- BP_InputPracticeをプレイヤーとして動かし、Spaceでジャンプできる
- IMC_PlayerControlsに、IA_PracticeJumpのSpace Barが1つだけある
- InputSubsystem変数に、プレイヤーのEnhanced Input Local Player Subsystemを保存している
- BeginPlayでIMC_PlayerControlsとIMC_Commonを有効にしている
今回はジャンプの1枠だけを扱います。JはEnhanced Input入門で使っていないキーなので、変更後の違いを確かめやすくなります。運転モードへ切り替えた場合は、徒歩へ戻してから試します。
1. User Settingsを有効にする
Playを止め、「編集」→「プロジェクト設定」でEnhanced Inputを開き、Enable User Settingsをオンにします。変更を保存し、開いているアセットも保存してからエディタを再起動します。
User Settingsは、プレイヤーごとの変更を保持・保存する窓口です。Enhanced Input入門のInputSubsystemが「今使う操作表」の管理役だったのに対し、こちらは「このプレイヤーが選んだ設定」を扱います。
2. ジャンプの行へ名前を付ける
IMC_PlayerControlsを開き、IA_PracticeJumpのSpace Barの行を展開します。
- Setting Behaviorを
Override Settingsにする - Player Mappable Key Settingsの選択欄から「Player Mappable Key Settings」を選び、項目を展開する
- Nameを
JumpKey、Display Nameをジャンプにする
Override Settingsは、「このキー行に用意した設定を使う」という選択です。Player Mappableは、プレイヤーが変更できる割り当てという意味です。
Nameは、後から変更対象を探すための名前です。画面に見せる「ジャンプ」と、処理が探す JumpKey を分けています。IAのアセット名を自動で探してくれるわけではないので、以降もJumpKeyで揃えます。

ほかのキー行は変更しません。保存して閉じます。
3. 設定の窓口へ、この操作表を登録する
BP_InputPracticeでGet InputSubsystemから Get User Settings を作ります。出力を変数へ昇格し、InputUserSettings と名付けます。

BeginPlayの白い線を、次の順に組み直します。
- Set InputSubsystem
- Set InputUserSettings
Is ValidでInputUserSettingsを確認- Is Valid側から
Register Input Mapping Context - 既存のAdd Mapping ContextでIMC_PlayerControlsを追加
- 既存のAdd Mapping ContextでIMC_Commonを追加
RegisterのTargetはGet InputUserSettings、IMCはIMC_PlayerControlsです。AddのTargetは、Enhanced Input入門と同じGet InputSubsystemです。Is Not Valid側はPrint Stringで User Settings unavailable と表示し、そこで止めます。

Registerは変更対象の登録、Addは操作表の有効化を担当します。似ていますが、役割が違います。Registerを通すことで、JumpKeyという変更対象がUser Settingsへ用意されます。
コンパイルしてPlayし、エラーが出ず、Spaceで跳べることを確認します。まだキーは変わりません。ここまでで、変更を受け付ける側の準備ができました。
キーを選ぶ設定画面を作る
Playを止め、Widget Blueprintを作って WBP_KeySettings と名付けます。UMGが初めてなら、Widget Blueprintの入門でDesignerとGraphの使い分けを確認できます。
DesignerでCanvas Panelの中央へVertical Boxを置き、次の部品を縦に並べます。文字とボタンが収まるよう、幅は400程度を目安にします。
| 部品 | 名前 | 表示・設定 |
|---|---|---|
| Text | 見出し用 | ジャンプのキー |
| Input Key Selector | JumpKeySelector | キーを選ぶ部品。Is Variableをオン |
| Text | StatusText | 最初は空欄。Is Variableをオン |
| Button+Text | CloseButton | 閉じる |
Input Key Selectorは、クリックすると次のキーを待ち、選ばれたキーを表示する部品です。ボタンと入力待ちを一から作らずに使えます。ただし、ゲームの割り当ての変更や保存は、これからつなぐ処理の担当です。
JumpKeySelectorは次のように設定します。
- Allow Gamepad Keys:オフ
- Allow Modifier Keys:オフ
- Key Selection Text:
キーを押してください - No Key Specified Text:
未設定 - Escape Keys:BackSpaceを追加

この練習では、 変更を待っている間にBackspaceを押すと取り消せるようにします。エディタのPlayではEscがプレイ終了に使われるため、試しやすい別のキーにしています。Backspaceをジャンプへ割り当てる練習ではありません。
WBP_KeySettingsへ次の変数を作ります。
| 変数 | 型 | 用途 |
|---|---|---|
| InputUserSettings | Enhanced Input User SettingsのObject Reference | 設定を読み書きする相手。Instance EditableとExpose on Spawnをオン |
| bRefreshingKey | Boolean、既定値false | プログラムから表示を直している間の目印 |
Expose on Spawnは、Widgetを作るときに値を渡せる設定です。後でBP_InputPracticeから、取得済みのInputUserSettingsを渡します。変数を設定したら、Widgetをコンパイルして保存します。
画面を開き、ゲーム操作へ戻る
部品を並べた画面を、まずゲームから開けるようにします。キー変更中は入力をUIへ向け、閉じたらキャラクターへ戻します。
1. Kキーで開く
InputPracticeフォルダへ、Digital (Bool)の IA_OpenKeySettings を作ります。Triggersは空にし、IMC_CommonでKへ割り当てます。設定画面を開くキーは、今回変更するジャンプの行とは別です。
BP_InputPracticeでIA_OpenKeySettingsのStartedから Create Widget を呼び、ClassにWBP_KeySettingsを指定します。
- Owning Player:Get Player Controller(Player Index=0)
- Input User Settings:Get InputUserSettings
Owning Playerは、この画面を使うプレイヤーです。渡したControllerは、UIとゲームの入力を切り替えるときにも使います。
Create WidgetのReturn Valueを変数へ昇格し、KeySettingsWidget と名付けます。白い線を次の順に接続します。
- Create Widget → Set KeySettingsWidget
- Add to Viewport(TargetはGet KeySettingsWidget)
- Set Input Mode UI Only
- Set Show Mouse Cursor=true

Set Input Mode UI OnlyのPlayer ControllerはGet Player Controllerの出力、In Widget to FocusはGet KeySettingsWidgetです。Mouse Lock ModeはDo Not Lockにし、Flush Inputがある版ではオンにします。Set Show Mouse Cursorも、同じControllerをTargetにします。
WBP_KeySettingsのClass DefaultsでIs Focusableをオンにしておきます。UI Onlyは、設定画面を触る間の入力をUIへ向ける指定です。

2. 閉じるボタンで操作を戻す
WBP_KeySettingsでCloseButtonのOn Clickedを追加します。白い線を Remove From Parent(Target=self)→ Set Input Mode Game Only → Set Show Mouse Cursor=false へつなぎます。
Game OnlyのPlayer Controllerには Get Owning Player を渡し、Flush Inputをオンにします。マウスカーソルのTargetも同じGet Owning Playerです。押されていたキーの状態を引き継がず、ゲーム操作へ戻すための設定です。

画面を消すだけでは、入力先がUI Onlyのまま残ります。画面を閉じる処理と、入力をゲームへ戻す処理をセットにします。
コンパイルしてPlayし、Kで画面を開いてみます。この段階ではキー欄は「未設定」のままで構いません。「閉じる」で操作へ戻り、Spaceで跳べれば、画面の出入りができました。次に、この欄へ実際のキーを表示します。
現在のキーを読み出して表示する
設定画面を開くたびにSpaceと書いてしまうと、前回Jへ変えた人にもSpaceと表示されます。表示するのは、初期値ではなく現在のキーです。
RefreshJumpKey関数を作る
WBP_KeySettingsに、入力も戻り値もない関数 RefreshJumpKey を作ります。
まず、Get InputUserSettingsから Find Mappings in Row を置き、Mapping NameをJumpKeyにします。返ってくるのは、この名前に属する割り当ての集まりです。出力から To Array を作り、配列として取り出せる形にします。
今回はSpaceの1枠だけなので、配列のLengthが 1 と等しいかを調べます。

関数の入口からSet bRefreshingKey=true、続いてBranchへつなぎ、この比較をConditionへ渡します。
BranchのFalse側は、JumpKeySelectorをSet Is Enabled=falseにし、StatusTextへSet Textで JumpKeyの登録を確認してください と表示します。最後にSet bRefreshingKey=falseへつなぎます。1枠であることを確かめてから、配列の0番を読むためです。

割り当ての中から読むのは、プレイヤーが今使うCurrent Keyです。Default KeyはIMCで決めた初期値なので、ここでは使いません。
Input Chordは、キーとShiftなどの修飾キーをひとまとめにした値です。今回はJやSpaceの1キーを扱いますが、Selectorへ渡すときは、この形に包みます。

True側は、次の順に処理します。
- JumpKeySelectorをTargetに
Set Is Enabledを呼び、trueにする - 配列のGet(Index=0)を
Break Player Key Mappingへ渡す - Current Keyを
Make Input ChordのKeyへ渡す。Shift/Ctrl/Alt/Cmdはすべてfalse - JumpKeySelectorをTargetに
Set Selected Keyを呼び、Make Input Chordの出力をIn Selected Keyへ渡す - Set bRefreshingKey=falseで終える
Get、Break、Makeは値を渡すためのノードです。白い線はBranchからSet Is Enabled、Set Selected Key、Set bRefreshingKeyの順に通します。

bRefreshingKeyは、表示を直す処理がキー変更として再び受け取られても、繰り返し処理しないための目印です。次の節で使います。
イベントグラフの Event Construct からRefreshJumpKeyを呼びます。画面が組み立てられるたびに、現在の設定からキー表示を作れるようになりました。コンパイルしてPlayし、Kで開いた欄が「未設定」からSpaceへ変わることを確かめます。
選んだキーへ変更して保存する
DesignerでJumpKeySelectorを選び、詳細のEventsから On Key Selected を追加します。これが、キーを選んだときに受け取るイベントです。
1. 表示の更新中なら、変更処理を始めない
On Key SelectedからBranchへつなぎ、ConditionにはGet bRefreshingKeyを渡します。True側はつながず終了、False側からキー変更を進めます。

これでRefreshJumpKeyによる表示更新と、プレイヤーが選んだ変更を分けられます。
2. 選んだキーと、変更先を渡す
イベントのSelected Keyを Break Input Chord へ渡します。先ほど表示用に包んだ値を、今度は分けて、Keyを取り出します。
Map Player Key を置き、TargetをGet InputUserSettingsにします。In Argsは、どの枠を何のキーへ変えるかをまとめて渡す入力です。このピンから Make Map Player Key Args を作り、次の値を入れます。
| 項目 | 設定 |
|---|---|
| Mapping Name | JumpKey |
| Slot | First |
| New Key | Break Input ChordのKey |
| Hardware Device Id | None |
| Profile Id関連 | 空欄のまま |
| Create Matching Slot If Needed | オフ |
| Defer On Settings Changed Broadcast | オフ |
Slotは、同じ操作へ用意するキーの枠です。今回はジャンプの1つ目だけを変更するのでFirstを使います。枠を増やす処理にはしません。デバイス別の識別や複数プロファイルは、ここでは既定のまま進めます。

白い線は、前のBranchのFalseからMap Player Keyへつなぎます。Selected KeyをそのままNew Keyへ渡すのではなく、Break Input ChordのKeyを渡す点を確認してください。

3. 変更できたら保存し、表示を読み直す
Map Player Keyの Failure Reason は、変更できなかった理由を入れる集まりです。中身が0件なら、失敗理由はありません。
Failure Reasonから Get Num Gameplay Tags in Container を作り、Return Valueが0と等しいかを調べます。ノード名は長いですが、ここで調べるのは失敗理由の件数です。Map Player Keyの白い出力をBranchへつなぎ、この比較をConditionへ入れます。

True側はSave Settings → RefreshJumpKey → StatusTextのSet Textとつなぎ、変更しましたと表示します。Save SettingsのTargetはGet InputUserSettings、Set TextのTargetはStatusTextです。

False側は保存せず、RefreshJumpKey → StatusTextのSet Textとつなぎ、変更できませんでした。登録名と枠を確認してくださいと表示します。Selectorが一時的に選んだキーを、設定側が実際に持つキーへ戻すためです。

Map Player Keyは実行中の割り当てを変更し、Save Settingsは次の起動でも使えるよう保存します。画面を閉じて同じゲームを続けるだけなら保存漏れに気付きにくいため、後で起動し直して確かめます。
表示、動作、保存を順に試す

すべてコンパイルして保存し、Playしてゲーム画面をクリックします。
- Spaceで跳べることを確認し、着地してからKを押す
- 設定画面にSpaceが表示される
- キー欄をクリックし、Jを押して離す。「変更しました」とJが表示される
- 「閉じる」を押す。Jで跳べ、Spaceでは跳ばなくなる
- Kで開き直しても、Jが表示される
- キー欄をクリックし、Backspaceで取り消す。Jのままなら取消も確認できる
次にPlayを終了し、もう一度開始します。さらにエディタを閉じてプロジェクトを開き直した場合も、設定画面のJと、Jでのジャンプを確認します。
表示が残ることと、実際にそのキーで動くことの両方を見ます。保存した設定はUser Settingsの初期化時に読み込まれ、起動時のRegisterで同じJumpKeyの項目を用意する流れになります。
初期値へ戻すボタンを加える
設定画面へButtonを追加し、ResetButton、表示文字を「初期値に戻す」にします。
On Clickedから Reset All Player Keys In Row を呼びます。TargetはGet InputUserSettings、In ArgsはMake Map Player Key Argsです。Mapping NameをJumpKeyにし、ほかは既定のままにします。

このノードは、指定した操作行を初期割り当てへ戻します。今回のJumpKeyは1枠だけなので、Spaceへ戻ります。すべての操作の設定を消す処理ではありません。
Failure Reasonを前の節と同じように0件か調べ、Branchで分けます。
- True:Save Settings → RefreshJumpKey → StatusTextを
初期値に戻しましたにする - False:RefreshJumpKey → StatusTextを
初期値に戻せませんでしたにする
Jへ変更してからこのボタンを押し、Spaceの表示とSpaceでのジャンプを確認します。起動し直してもSpaceなら、初期値へ戻した結果も保存できています。
元の表を残してプレイヤーの変更を重ねる仕組みが、ここで役立ちます。「初期値は何だったか」を画面側の文字列で別に覚える必要がありません。
うまく動かないときのチェック
まず「設定を読めない」「変更できない」「ゲーム入力へ届かない」「保存されない」のどこで止まったかを分けます。
| 症状 | 確認するところ |
|---|---|
| User Settings unavailableと出る | Enable User Settingsを有効にして再起動したか。Get User SettingsのTargetがInputSubsystemか |
| JumpKeyの登録を確認してくださいと出る | Space行のOverride Settings、Name=JumpKey、Registerの実行を確認。JumpKeyに余分なキー行を作っていないか |
| Input User Settings入力がCreate Widgetに出ない | Widget側の変数でInstance EditableとExpose on Spawnをオンにし、コンパイルしたか |
| Selected KeyをNew Keyへつなげない | Break Input ChordでKeyだけを取り出したか |
| 「変更できませんでした」と出る | Mapping Name=JumpKey、Slot=Firstか。登録前に変更していないか |
| Jの表示なのに跳べない | 徒歩モードか。「閉じる」でGame Onlyへ戻したか。IA_PracticeJumpがJumpを呼ぶか |
| 開き直すとSpaceと表示される | RefreshJumpKeyがDefault KeyではなくCurrent Keyを使っているか |
| 再起動すると元へ戻る | Map成功後のSave Settingsが実行されているか。起動時にリセット処理を呼んでいないか |
| 表示更新が何度も続く | Set Selected Keyの前後でbRefreshingKeyを切り替え、On Key Selected側で止めているか |
詳しく調べるときは、MapやResetのFailure Reasonを文字列化してPrint StringとOutput Logへ出すと、失敗理由を追えます。
おまけ:操作を増やすときの考え方
同じキーを選んだら、どうする?
今回は空いているJで試しました。移動のWや、設定画面を開くKをジャンプにも割り当てると、操作が競合します。Map Player Keyを呼ぶだけで、ゲームに都合のよい整理まで自動で行われるわけではありません。
| 方針 | プレイヤーへの見せ方 |
|---|---|
| 重複を許可する | 同じキーを複数の操作に使う |
| 重複を拒否する | 「そのキーは移動に使われています」と知らせる |
| 入れ替える | 既存の操作を、変更前のキーへ移す |
同じキーで両方の処理が動くかは、IMCの優先度や入力を消費する設定にも関わります。まずは変更前にほかの割り当てと比較し、重複を拒否する形が追いやすいでしょう。設定画面を開くキーや取消キーを予約する考え方もあります。
Slotとデバイスを分けて考える
Slotは、たとえばジャンプに「SpaceとJの2候補」を持たせるときの枠です。FirstやSecondが、そのままキーボードやゲームパッドを意味するわけではありません。
ゲームパッドの割り当ても変更可能にするなら、どの操作・枠・デバイスを対象にするか決め、表示する行とMapへ渡す対象を揃えます。同じJumpKeyへ複数枠を登録する場合は、読み出しのLength=1という判定も見直します。ゲームパッド対応の記事が次の入口になります。
Apply Settingsと保存は、同じ処理ではない
Enhanced Input User Settingsの Apply Settings は、独自の入力設定を適用したり、適用後の更新を知らせたりするためのものです。既定ではOnSettingsAppliedを通知します。
今回のキー変更はMap Player Key、保存はSave Settings、画面の読み直しはRefreshJumpKeyで役割が揃っています。「Applyを呼ばなければ新しいキーが保存されない」とは考えないでください。
設定項目の名前は、公開後も大切にする
JumpKeyのようなNameは、保存した設定と現在の操作を結びつける名前です。後から気軽に変えると、以前の設定との対応が失われることがあります。
操作を増やしたら、移動・ジャンプ・攻撃などの行ごとに何を変更するのかを整理します。最初の1行で作った「現在の値を読む → 選び直す → 結果を確かめて保存する」という流れを、各行で使い回せます。
まとめ
キーコンフィグは、キーを待ち受ける画面と、プレイヤーの割り当てを持つ設定をつなぐ機能です。Input Key Selectorでキーを受け取り、User Settingsへ登録したJumpKeyの枠を変更します。
仕上げでは、表示だけで成功と判断せず、画面を閉じた後のジャンプと、起動し直した後のキーも確かめましょう。1行が最後まで動けば、操作項目を増やすときにも同じ流れを土台にできます。
参考:User Settings、操作表の登録、Map Player Key、Input Key Selector、Apply Settingsの役割。