Wキーで前へ歩く。車に乗っている間は、同じWキーをアクセルに使う。キーは同じでも、ゲームの状況によってやりたいことは変わります。
Enhanced Inputは、この「やりたいこと」と「どのキーか」を分けて扱う仕組みです。最初は設定するアセットが多く見えますが、役割が分かると、キー配置や操作モードを変える場所も見えてきます。
この記事では、まずキーを押すと文字が出るところまでつなぎ、WASD移動とジャンプへ進みます。最後はFキーで操作表を切り替え、同じWが「歩く入力」から「アクセルの入力」へ変わることを確かめます。
この記事でわかること
- Input Action、Mapping Context、Subsystemの役割
- WASDの値を、左右・前後の入力へ揃える方法
- StartedとTriggeredの違い、長押しの作り方
- 共通の操作を残し、移動用の操作表だけを切り替える実践
やりたいことと、キーの割り当てを分ける
最初に覚えたいのは、Input Action(IA) と Input Mapping Context(IMC) です。
IAは「移動する」「ジャンプする」といった操作の名札です。キーの名前ではなく、ゲームで何をしたいかを表します。IMCは、その名札とキーを結びつける操作表です。「ジャンプはSpace」という割り当ては、こちらへ書きます。
他のエンジンでいうと: Unity の Input System(Actionベース) 、Godot の InputMap のアクション に当たります。表そのものを差し替える Mapping Context は、UE独自の考え方です。

そし て、その表を今のプレイヤーへ適用する窓口が、Enhanced Input Local Player Subsystemです。長い名前ですが、ここでは「自分のプレイヤーが使う操作表を管理するもの」と考えてください。作ったIMCを Add Mapping Context で渡すと、その表が有効になります。
ただし、表を有効にしただけでキャラクターが跳ぶわけではありません。BlueprintでIAのイベントを受け、Jumpなどの処理へつなぎます。
| 決めたいこと | 設定する場所 |
|---|---|
| ジャンプという操作を作る | Input Action |
| Spaceでジャンプできるようにする | IMCのキー割り当て |
| 今、この操作表を使う | SubsystemへAdd Mapping Context |
| 入力を受けたら実際に跳ぶ | BlueprintのIAイベント |
この分担なら、ジャンプを別のキーへ移しても、跳ぶ処理を作り直さずに済みます。徒歩と運転のように、表そのものを入れ替えることもできます。
値を反転するModifierや、長押しなどの成立条件を決めるTriggerは、この入力へ追加する設定です。まずは何も付けない入力を1つ通し、後で違いを試しましょう。
練習用のキャラクターを用意する
Third PersonのBlueprintプロジェクトを使います。新規作成時に「Variant」がある版では None を選びます。コンポーネントの追加、変数の作成、ピンの接続を知っている人向けです。
テンプレートには入力が組み込まれています。今回は自分で作った入力の結果を確かめられるように、練習用のCharacterとGameModeを用意します。レベルはThird Personの床があるマップを使えます。
1. 体とカメラを作る
コンテンツブラウザに InputPractice フォルダを作り、以降のアセットはここへ保存します。Blueprint Classの親に Character を選び、BP_InputPractice と名付けます。Characterには、歩行や重力を扱うCharacter Movementが最初から付いています。
Capsule ComponentはCapsule Radiusを34、Capsule Half Heightを88にし、コンポーネントを次のように加えます。
| 部品 | 親 | 設定 |
|---|---|---|
| Body(Static Mesh) | Capsule Component | 標準Cube、Relative Locationは0、ScaleはX=0.5 / Y=0.5 / Z=1.76 |
| SpringArm | Capsule Component | Relative LocationのZ=60、RotationのPitch=-25、Yaw/Roll=0、Target Arm Length=400 |
| Camera | SpringArm | Relative LocationとRotationはすべて0 |
BodyはCollision PresetsをNoCollision、Simulate Physicsをオフにします。衝突は、体を囲むCapsule Componentに任せます。既存のMeshには何も割り当てなくて構いません。
SpringArmとCameraのUse Pawn Control Rotationはオフにします。Class DefaultsのUse Controller Rotation Pitch/Yaw/Rollもすべてオフ、Character MovementのOrient Rotation to MovementとUse Controller Desired Rotationもオフにします。
今回はカメラと体の向きを固定したまま、四角いキャラクターを歩かせます。入力方向と実際の移動を比べやすくするためです。カメラをマウスで回す処理は、ここでは加えません。
2. このCharacterをプレイヤーにする
GameModeBaseを親に BP_InputPracticeGameMode を作ります。Class DefaultsでDefault Pawn Classを BP_InputPractice、Player Controller Classを標準の PlayerController にします。
レベルの「ワールドセッティング」でGameMode OverrideをこのGameModeへ変えます。PlayerStartは床の上に置き、回転を0に揃えます。CharacterはGameModeから生成するので、BP_InputPracticeを手でレベルへ置く必要はありません。
GameModeは、このレベルで使うプレイヤーなどを決める設定役です。詳しい分担はゲームプレイフレームワークの記事でも説明しています。
コンパイルして保存し、Playします。四角い体を後ろから見るカメラになれば準備できています。この段階ではまだ動きません。

まずはEキーで文字を表示する
最初の目標は、Eを1回押すと Interact と表示されることです。Playを止め、移動より先に、入力が届く経路を作ります。
1. 操作とキーを結びつける
コンテンツブラウザの右クリックから「Input」→「Input Action」を作り、IA_Interact と名付けます。開いてValue Typeを Digital (Bool) にします。Value Typeは、その操作で受け取る値の種類です。今回は押した・押していないの2択なのでBoolを使います。
続いて「Input」→「Input Mapping Context」で IMC_PlayerControls を作ります。Mappingsの + でIA_Interactの行を追加し、キーを E にします。ModifiersとTriggersは空のまま保存します。
2. 操作表を有効にする
BP_InputPracticeのイベントグラフへ戻ります。Get Player Controller を置き、Player Indexを0にします。出力から Get Enhanced Input Local Player Subsystem を作ります。
この2つは、値を取り出すノードです。白い実行線は通しません。Player ControllerのReturn Valueを、Subsystem取得ノードのPlayer Controller入力へつなぎます。

SubsystemのReturn Valueを右クリックして「変数へ昇格」し、InputSubsystem と名付けます。これは後からも同じ窓口を指定できるよう、取得したものを覚えておく変数です。
Event BeginPlay から Set InputSubsystem へ白い線をつなぎ、その次に Add Mapping Context を呼びます。
- Target:Get InputSubsystemの青い出力
- Mapping Context:IMC_PlayerControls
- Priority:0
Priorityは、複数の表で入力が競合したときに使う優先度です。今は表が1枚なので0で進めます。Optionsは既定のままにします。

3. 入力を受けて表示する
イベントグラフで IA_Interact を検索し、Enhanced Input Actionのイベントを追加します。右側の Started を Print String の白い実行入力へつなぎ、In Stringに Interact、Durationに2を入れます。

コンパイルして保存し、Playしてゲーム画面をクリックします。Eを押すたびに文字が1回出れば成功です。IA、キーの割り当て、表の有効化、受信イベントまでがつながりました。
同じキーを押し続けても、Startedからの表示は増え続けません。この入力では、押し始めの1回を受け取っているためです。
WASD移動とジャンプを加える
入力の経路ができたので、Playを止め、同じ操作表へ移動とジャンプを足します。
1. 値の種類を決める
InputPracticeフォルダへ、次のInput Actionを新しく作ります。テンプレートのIA_MoveやIA_Jumpと区別するため、練習用の名前にしています。
| 名前 | Value Type | 受け取るもの |
|---|---|---|
| IA_PracticeMove | Axis2D (Vector2D) | 左右と前後、2つの数値 |
| IA_PracticeJump | Digital (Bool) | 押した・押していない |
今回は、移動入力のXを左右、Yを前後に使います。これは入力値の使い方の約束で、UEのワールド座標の軸とは別です。後で「この入力をどちらへ動く量に使うか」をつなぎます。
2. WASDの値を、左右と前後へ揃える
IMC_PlayerControlsへ、次のキー割り当てを加えます。IA側のModifiersとTriggersは空のまま、以下はIMCの各キー行にあるModifiersへ設定します。
| Input Action | キー | Modifiers(上から順) | 1キーを押したときの入力 |
|---|---|---|---|
| IA_PracticeMove | D | なし | X=1 / Y=0 |
| IA_PracticeMove | A | Negate | X=-1 / Y=0 |
| IA_PracticeMove | W | Swizzle Input Axis Values:Order=YXZ | X=0 / Y=1 |
| IA_PracticeMove | S | Swizzle Input Axis Values:Order=YXZ → Negate | X=0 / Y=-1 |
| IA_PracticeJump | Space Bar | なし | true |
NegateはX/Y/Zをすべてオンにしておきます。AではX、Swizzle後のSではYに値があるため、それぞれの符号が反転します。
なぜWとSにだけSwizzleが要るのでしょうか。キーボードの1キーは、加工 前にはXへ1を出すからです。Wを押しても、最初の値は (1, 0) です。そのままでは、今回の約束では右への入力になってしまいます。

Swizzle Input Axis Values のYXZは、XとYの並びを入れ替えます。(1, 0) は (0, 1) になり、Wを前への入力として扱えます。SはさらにNegateで (0, -1) にするので後ろです。Aは左右の軸のまま、符号だけ変えれば足ります。
3. 入力値を移動へつなぐ
BP_InputPracticeで IA_PracticeMove のイベントを追加します。Action Valueから Break Vector2D を作ると、入力をXとYへ分けられます。

Add Movement Input を2つ置き、Targetはどちらもselfのままにします。selfは、このグラフを持つBP_InputPractice自身です。
| ノード | World Direction | Scale Value |
|---|---|---|
| 前後用のAdd Movement Input | X=1 / Y=0 / Z=0 | Break Vector2DのY |