【Unreal Engine】UE5のEnhanced Input入門:WASD移動から、操作の切り替えまで

作成: 2025-12-12最終更新: 2026-09-05

Input Actionはやりたいこと、Mapping Contextはキーの割り当て表。入力が届いたことを確認してから、WASD移動とジャンプ、長押し、徒歩と運転モードの切り替えを組み立てます。

Wキーで前へ歩く。車に乗っている間は、同じWキーをアクセルに使う。キーは同じでも、ゲームの状況によってやりたいことは変わります。

Enhanced Inputは、この「やりたいこと」と「どのキーか」を分けて扱う仕組みです。最初は設定するアセットが多く見えますが、役割が分かると、キー配置や操作モードを変える場所も見えてきます。

やりたいことと、どのキーを使うかを別々のカードとして扱う

この記事では、まずキーを押すと文字が出るところまでつなぎ、WASD移動とジャンプへ進みます。最後はFキーで操作表を切り替え、同じWが「歩く入力」から「アクセルの入力」へ変わることを確かめます。

この記事でわかること

  • Input Action、Mapping Context、Subsystemの役割
  • WASDの値を、左右・前後の入力へ揃える方法
  • StartedとTriggeredの違い、長押しの作り方
  • 共通の操作を残し、移動用の操作表だけを切り替える実践

Sponsored

やりたいことと、キーの割り当てを分ける

最初に覚えたいのは、Input Action(IA)Input Mapping Context(IMC) です。

IAは「移動する」「ジャンプする」といった操作の名札です。キーの名前ではなく、ゲームで何をしたいかを表します。IMCは、その名札とキーを結びつける操作表です。「ジャンプはSpace」という割り当ては、こちらへ書きます。

他のエンジンでいうと: Unity の Input System(Actionベース) 、Godot の InputMap のアクション に当たります。表そのものを差し替える Mapping Context は、UE独自の考え方です。

Input Actionはやりたいこと、Mapping Contextはキーの割り当て、Subsystemは使う表を管理する

そして、その表を今のプレイヤーへ適用する窓口が、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
SpringArmCapsule ComponentRelative LocationのZ=60、RotationのPitch=-25、Yaw/Roll=0、Target Arm Length=400
CameraSpringArmRelative 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します。四角い体を後ろから見るカメラになれば準備できています。この段階ではまだ動きません。

カプセルの子にBodyとSpringArmを置き、SpringArmの先にCameraを付ける

まずは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入力へつなぎます。

Player ControllerからEnhanced Input Local Player Subsystemを取得する

SubsystemのReturn Valueを右クリックして「変数へ昇格」し、InputSubsystem と名付けます。これは後からも同じ窓口を指定できるよう、取得したものを覚えておく変数です。

Event BeginPlay から Set InputSubsystem へ白い線をつなぎ、その次に Add Mapping Context を呼びます。

  • Target:Get InputSubsystemの青い出力
  • Mapping Context:IMC_PlayerControls
  • Priority:0

Priorityは、複数の表で入力が競合したときに使う優先度です。今は表が1枚なので0で進めます。Optionsは既定のままにします。

BeginPlayでSubsystemを覚え、IMC_PlayerControlsを有効にする

3. 入力を受けて表示する

イベントグラフで IA_Interact を検索し、Enhanced Input Actionのイベントを追加します。右側の StartedPrint String の白い実行入力へつなぎ、In Stringに Interact、Durationに2を入れます。

IA_InteractのStartedからPrint Stringを呼び、押し始めに1回表示する

コンパイルして保存し、Playしてゲーム画面をクリックします。Eを押すたびに文字が1回出れば成功です。IA、キーの割り当て、表の有効化、受信イベントまでがつながりました。

同じキーを押し続けても、Startedからの表示は増え続けません。この入力では、押し始めの1回を受け取っているためです。

WASD移動とジャンプを加える

入力の経路ができたので、Playを止め、同じ操作表へ移動とジャンプを足します。

1. 値の種類を決める

InputPracticeフォルダへ、次のInput Actionを新しく作ります。テンプレートのIA_MoveやIA_Jumpと区別するため、練習用の名前にしています。

名前Value Type受け取るもの
IA_PracticeMoveAxis2D (Vector2D)左右と前後、2つの数値
IA_PracticeJumpDigital (Bool)押した・押していない

今回は、移動入力のXを左右、Yを前後に使います。これは入力値の使い方の約束で、UEのワールド座標の軸とは別です。後で「この入力をどちらへ動く量に使うか」をつなぎます。

2. WASDの値を、左右と前後へ揃える

IMC_PlayerControlsへ、次のキー割り当てを加えます。IA側のModifiersとTriggersは空のまま、以下はIMCの各キー行にあるModifiersへ設定します。

Input ActionキーModifiers(上から順)1キーを押したときの入力
IA_PracticeMoveDなしX=1 / Y=0
IA_PracticeMoveANegateX=-1 / Y=0
IA_PracticeMoveWSwizzle Input Axis Values:Order=YXZX=0 / Y=1
IA_PracticeMoveSSwizzle Input Axis Values:Order=YXZ → NegateX=0 / Y=-1
IA_PracticeJumpSpace Barなしtrue

NegateはX/Y/Zをすべてオンにしておきます。AではX、Swizzle後のSではYに値があるため、それぞれの符号が反転します。

なぜWとSにだけSwizzleが要るのでしょうか。キーボードの1キーは、加工前にはXへ1を出すからです。Wを押しても、最初の値は (1, 0) です。そのままでは、今回の約束では右への入力になってしまいます。

Wが出すXの値をSwizzleでYへ移し、前への入力として使う。Negateは符号を反転する

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へ分けられます。

Action ValueをBreak Vector2Dへ渡し、左右のXと前後のYへ分ける

Add Movement Input を2つ置き、Targetはどちらもselfのままにします。selfは、このグラフを持つBP_InputPractice自身です。

ノードWorld DirectionScale Value
前後用のAdd Movement InputX=1 / Y=0 / Z=0Break Vector2DのY
左右用のAdd Movement InputX=0 / Y=1 / Z=0Break Vector2DのX

World Directionは、ワールド上でどちらへ動きたいかを示す向きです。Scale Valueは、その向きへ加える入力の量で、マイナスなら逆向きになります。Character Movementがこの入力を使って、歩行を処理します。

白い線は、IA_PracticeMoveのTriggered → 前後用 → 左右用の順につなぎます。Action ValueからBreakへ、BreakのX/YからScale Valueへ渡すのは、値の線です。Breakには白い線を通しません。

入力のYを前後用、Xを左右用のScale Valueへ渡し、白い線で2つの移動入力を順に呼ぶ

コンパイルしてPlayし、W/Sで前後、A/Dで左右へ動くか確かめます。今回はカメラの向きを固定しているので、前後左右の基準も変わりません。

入力の値と移動速度は別です。速さはCharacter MovementのMax Walk Speedなどで調整します。走行や空中操作へ進むなら、Character Movementの記事が次の入口になります。

4. ジャンプをつなぐ

IA_PracticeJumpのイベントを置き、Startedを Jump、Completedを Stop Jumping へつなぎます。Targetはどちらもselfです。Triggeredは今回は使いません。

StartedをJump��の実行入力、CompletedをStop Jumpingの実行入力へつなぐ

Class DefaultsでJump Max Countを1、Jump Max Hold Timeを0にしておきます。Spaceを1回押すと跳び、床へ戻れば成功です。Stop Jumpingはジャンプ入力の終了を伝えるもので、空中で即座に着地させる命令ではありません。

StartedとTriggeredを使い分ける

いま作った、Triggerを付けていない基本の入力では、次のように使えます。

出力今回の入力での動き接続した処理
Started押し始めに1回表示、ジャンプ開始
Triggered押して値が出ている間、毎フレーム移動入力
Completed入力が終わったときジャンプ入力の終了

移動の線を一時的にStartedへ替えると、押し続けても最初の瞬間しか移動入力が加わりません。確認したらTriggeredへ戻し、押している間歩けることを再確認します。

ただし、Triggeredが毎フレーム出るかは、付けたTriggerによって変わります。また、Startedは「条件を調べ始めた」という合図です。長押しを付けた場合の違いを、次に試します。

Sponsored

長押しで発動する入力へ変えてみる

最初に作ったEキーの表示を、1秒長押ししてから出るように変えます。宝箱を開ける、誤操作を避けて決定する、といった入力の基本になる仕組みです。

Playを止め、IMC_PlayerControlsのIA_Interactに割り当てたEの行を開きます。Triggersへ Hold を1つ追加します。

  • Hold Time Threshold:1.0
  • Is One Shot:オン

Hold Time Thresholdは、成立するまで押し続ける秒数です。Is One Shotをオンにすると、長押しが成立したときに1回だけTriggeredが出ます。オフなら、成立後も押している間は繰り返し出せます。

BP_InputPracticeへ戻り、IA_InteractからPrint Stringへの線を、StartedからTriggeredへつなぎ替えます。表示文字は Hold OK に変えます。

最初のStartedによる表示から、Hold達成時のTriggeredによる表示へ替える

Playして、短くEを押して離してください。今度は表示が出ません。Eを1秒以上押し続けるとHold OKが1回出れば成功です。一度離して押し直せば、再び1秒後に出ます。

Startedのままだと、長押しを調べ始めた時点で表示されます。「押し始めた」と「長押しが成立した」は別のタイミングなので、受けるピンも合わせて変えます。

ほかに OngoingCanceled の出力もあります。Holdなら、成立を待つ途中の合図がOngoing、時間に届く前に離したときの合図がCanceledです。待っている表示を出す、途中でやめたら消す、といった処理に使えます。細かな状態の組み合わせは、必要になってから広げれば十分です。

Triggerは条件、Modifierは値の加工

WASDで使ったSwizzleとNegateは、入力値を加工するModifierでした。Holdは、いつ入力が成立するかを決めるTriggerです。

設定変えること使う場面
Hold(Trigger)一定時間押し続けると成立長押しで決定
Pressed(Trigger)押した瞬間だけ成立Triggeredから単発処理を呼ぶ
Tap(Trigger)短く押して離すと成立タップ操作
Chorded Action(Trigger)指定した別のIAが成立していることを条件にする別ボタンを押しながら使う操作
Scalar(Modifier)値を指定した倍率にする視点感度
Dead Zone(Modifier)小さな入力を無視するスティックのわずかなずれ対策

たとえば視点入力の値にScalarで0.5を掛ければ、同じ操作量でも回す量を半分にできます。スティックの調整はゲームパッド対応の記事で扱っています。

実践:徒歩と運転モードで操作表を切り替える

次は、同じWキーの意味を切り替えます。Fを押すと歩行入力を止め、代わりにアクセルの値を表示するところまで作ります。車のモデルや走行処理は加えず、操作表が入れ替わった結果を確認します。

徒歩の操作表を外して運転の操作表を付けると、同じWキーの意味が変わる

1. 運転用と共通の操作表を用意する

次のInput ActionとIMCをInputPracticeフォルダへ追加します。

種類名前設定
Input ActionIA_AccelerateAxis1D (Float)
Input ActionIA_SteerAxis1D (Float)
Input ActionIA_ToggleVehicleDigital (Bool)
Input Mapping ContextIMC_DrivingIA_AccelerateにW/S、IA_SteerにD/A
Input Mapping ContextIMC_CommonIA_ToggleVehicleにF

Axis1Dは、1つの数値を受ける型です。運転用はWとDを加工なし、SとAにNegateを付けます。Swizzleは不要です。いずれのIAもTriggersは空にします。

Fは、切り替えても残るIMC_Commonへ置きます。 徒歩用や運転用の表を外しても、元へ戻るキーを受け取れるようにするためです。

共通のFキーを残し、徒歩と運転の操作表だけを差し替える

BP_InputPracticeのBeginPlay側で、IMC_PlayerControlsを追加した後へ、もう1つAdd Mapping Contextをつなぎます。Targetは同じGet InputSubsystem、Mapping ContextはIMC_Common、Priorityは0です。開始時は「徒歩用+共通」の2枚が有効になります。

2. 入れ替わる操作を表示で確かめられるようにする

BP_InputPracticeへIA_AccelerateとIA_Steerのイベントを追加します。それぞれのTriggeredから、別々のPrint Stringを呼びます。

Action ValueをIn Stringへ直接つなぐと、数値から文字への変換が自動で入ります。どちらか区別するため、値の線の途中に Append を置き、Aへ Accel: または Steer: 、BへAction Valueを渡します。Appendは2つの文字列をつなぐノードです。数値から文字への変換を経てBへ入り、AppendのReturn ValueをPrint StringのIn Stringへつなぎます。

表示はDuration=0にします。Triggeredから毎フレーム呼ばれる間だけ値を確認する形です。

アクセルの値を文字へ変換し、Accelという見出しとつなげて表示する
入力表示
WAccel: 1
SAccel: -1
DSteer: 1
ASteer: -1

まだIMC_Drivingを有効にしていないので、この段階では運転用の表示は出ません。

3. Fを押したら、移動用の表だけを入れ替える

BP_InputPracticeにBoolean型の変数 bIsDriving を作り、既定値をfalseにします。今どちらの操作モードかを覚える変数です。

IA_ToggleVehicleのイベントを置き、StartedからBranchへつなぎます。ConditionにはGet bIsDrivingを渡します。

現在のbIsDrivingを調べ、Falseなら運転へ、Trueなら徒歩へ切り替える
Branchの経路白い実行線で呼ぶ順序
False:今は徒歩Remove Mapping Context(IMC_PlayerControls)→ Add Mapping Context(IMC_Driving)→ Set bIsDriving=true
True:今は運転Remove Mapping Context(IMC_Driving)→ Add Mapping Context(IMC_PlayerControls)→ Set bIsDriving=false

RemoveとAddのTargetは、4つともGet InputSubsystemです。AddのPriorityは0、Optionsは既定のままにします。IMC_Commonは外しません。 切り替えるのは徒歩用と運転用だけです。

False側は、徒歩の表を外して運転の表を加えます。青いSubsystemの線は、両ノードのTargetへつなぎます。

BranchのFalseか�ら徒歩用をRemoveし、運転用をAddした後、bIsDrivingをtrueにする

True側は逆の順です。運転の表を外して徒歩の表を加え、bIsDrivingをfalseへ戻します。

BranchのTrueから運転用をRemoveし、徒歩用をAddした後、bIsDrivingをfalseにする

4. 歩く、値を見る、歩くへ戻る

コンパイルして保存し、Playしてゲーム画面をクリックします。切り替えるときはいったんWASDを離し、Fも押した後に離してから、次の入力を試してください。

  1. 最初はWASDで歩ける。AccelやSteerは出ない
  2. Fを1回押して離す。その後Wを押すと、歩く代わりにAccel: 1が出る
  3. S/A/DでもマイナスやSteerの表示を確認する
  4. Fをもう1回押して離す。WASDで再び歩ける

これで、移動のイベント内に「運転中なら歩かない」というBranchを加えず、受け取る操作を切り替えられました。切り替え先を決めるBranchはFのイベント側にまとまっています。

Sponsored

うまく動かないときのチェック

最初に、「入力イベントが呼ばれていない」のか、「呼ばれた後の移動が違う」のかを分けます。IAのイベントからPrint Stringを呼ぶと、入力が届いた場所まで確認できます。

症状確認するところ
最初のEでも何も出ないゲーム画面をクリックしたか。GameMode OverrideとDefault Pawn Classが練習用か。IMC_PlayerControlsをAddしたか
テンプレートの人形が動くこのレベルのGameModeが練習用になっているか
Add Mapping ContextでエラーTargetがPlayer Controllerではなく、取得したInputSubsystemか。Get Player ControllerのIndexが0か
Wで右へ動くWのSwizzleがYXZか。入力のYを前後用のScale Valueへ渡したか
Sで前へ動くSのSwizzle後にNegateがあり、Yの反転もオンか
押し続けても少ししか動かない移動をStartedにつないでいないか
Eの長押しがすぐ発動するPrint StringをStartedからTriggeredへ替えたか
長押し後に何度も発動するHoldのIs One Shotがオンか
Fで運転にした後、戻れないIMC_Commonを開始時にAddしたか。切り替え時に外していないか
Fの後、歩かず数値も出ないIMC_Drivingのキー割り当て、Addの実行、運転用IAのPrintを確認

入力ノードが見つからない場合は、「編集」→「プラグイン」でEnhanced Inputが有効か確認します。既存の古いプロジェクトなら、Project SettingsのInputにあるDefault Player Input Classが EnhancedPlayerInput、Default Input Component Classが EnhancedInputComponent かも確認します。

値を表示する方法はPrint Stringの記事にまとめています。移動の確認でPrintへつなぎ替えた場合は、終わったらAdd Movement Inputへの線を戻してください。

おまけ:先に知っておくと良いこと

  • イベント名と物理キーの操作は、常に1対1ではない:Startedは評価開始、Triggeredは条件成立です。Completedも、どのTriggerでも必ずキーを離した瞬間という意味にはなりません。長押しやタップを加えたら、受けるイベントも確認します。
  • Priorityで表全体がオフになるわけではない:高い数値の表が優先される場面でも、競合しないキーは残り得ます。同じキーが下位の操作へ渡るかは入力の消費設定にも関わります。徒歩を無効にしたいなら、今回のように対象のIMCをRemoveする意図を明確にします。
  • キーを押したまま切り替える場合:Add/RemoveのOptionsには、押されているキーを離すまで無視する設定があります。切り替えた瞬間に新しい操作を発動させたいか、押し直してほしいかに合わせて調整します。
  • キーコンフィグへ広げる:ゲーム内で割り当てを変え、保存・復元する機能はリバインドの記事へ進めます。エディタでIMCを書き換えることと、プレイヤーの設定を保存することは分けて考えます。
  • C++でもIAと処理を結びつけるSetupPlayerInputComponent 内でEnhanced Input Componentへ BindAction し、IAと受けたいイベント、呼ぶ関数を登録します。Blueprintのイベントから線をつなぐ部分に相当します。BlueprintからC++への入口も参考になります。
  • 複数プレイヤーへ広げるとき:今回はローカル1人、Player Index=0で練習しました。分割画面やネットワークでは、入力を設定するプレイヤー自身のControllerとSubsystemを使うように構成を広げます。

まとめ

IAはやりたいこと、IMCはキーの割り当て、Subsystemは今使う表の管理役です。Blueprintは、届いたIAのイベントと値を使ってゲームを動かします。

まず1キーで表示を出し、移動へつなぐ。その後に長押しや操作表の切り替えを試すと、「どこを変えたから、動きが変わったか」を追いやすくなります。自分のゲームでも、共通で残す操作と、場面ごとに替える操作を分けるところから使ってみてください。

参考:EpicのEnhanced Input概要Holdの設定Add Movement Input操作表変更時のOptions

Unreal Engine このセクションのノート98