Enhanced Input Systemが必要な理由
Unreal Engine 4(UE4)まで使用されていた従来の入力システム(Action MappingとAxis Mapping)は、シンプルなゲームでは十分機能しましたが、プロジェクトが大規模化し、入力の種類や対応デバイスが増えるにつれて、いくつかの課題が顕在化していました。
従来の入力システムの主な課題:
- 管理の煩雑さ: すべての入力設定がプロジェクト設定ファイルに一元化されていたため、特定の入力(例: 「ジャンプ」)がどのキーに割り当てられているかを確認するために、設定全体を検索する必要がありました。
- コンテキストの切り替えの困難さ: プレイヤーが「歩行モード」から「運転モード」に切り替わった際など、状況に応じて入力設定を動的に変更するのが手間でした。コード内で手動で入力バインディングを解除・再設定する必要があり、バグの原因になりがちでした。
- 柔軟性の欠如: 長押し、ダブルタップ、同時押しといった複雑な入力条件を実装するには、BlueprintやC++で複雑なロジックを組む必要がありました。
Unreal Engine 5(UE5)で導入されたEnhanced Input System は、これらの課題を解決するために設計された、より柔軟で強力な入力管理フレームワークです。
Enhanced Input Systemの主要コンポーネント
Enhanced Input Systemは、主に以下の3つのア セットと1つのコンポーネントで構成されています。
| コンポーネント名 | 役割 | 従来のシステムとの対応 |
|---|---|---|
| Input Action (IA) | プレイヤーが実行したい抽象的なアクション を定義します(例: ジャンプ、移動、攻撃)。入力デバイスに依存しません。 | Action Mapping / Axis Mapping |
| Input Mapping Context (IMC) | どの入力デバイス (キーボードのSpaceキー、ゲームパッドのAボタンなど)を、どのInput Action に割り当てるかを定義します。 | Project SettingsのInputセクション |
| Input Trigger & Modifier | 入力アクションの発動条件(長押し、ダブルタップなど)や、入力値の加工(デッドゾーン、軸の反転など)を定義します。 | 従来のシステムには存在しない機能 |
| Enhanced Input Component | プレイヤーキャラクターなどのPawnにアタッチし、IMCを適用し、IAのイベントを受け取るためのコンポーネントです。 | 従来のInput Component |
重要なポイント: IAは「何をしたいか」、IMCは「どうやってそれを実現するか」を分離して管理します。これにより、入力設定の管理が劇的に容易になります。
Enhanced Input Systemの実装手順
ここでは、キャラクターを移動させるための基本的な設定をBlueprintで実装する手順を解説します。
Step 1: Input Action (IA)の作成
移動に必要な2つのIAを作成します。
- コンテンツブラウザで右クリックし、
Input->Input Actionを選択します。 - 移動方向の入力を受け取るための
IA_Moveを作成します。Value TypeをAxis2D (Vector2)に設定します。これは、X軸(左右)とY軸(前後)の2方向の入力を受け取るためです。
- ジャンプのための
IA_Jumpを作成します。Value TypeをDigital (Bool)に設定します。
Step 2: Input Mapping Context (IMC)の作成
次に、作成したIAに実際のキーを割り当てます。
- コンテンツブラウザで右クリックし、
Input->Input Mapping Contextを選択し、IMC_PlayerControlsを作成します。 IMC_PlayerControlsを開き、+ Mappingでマッピングを追加します。
| Input Action | Key / Button | Modifiers |
|---|---|---|
IA_Move | W (Keyboard) | Swizzle Input Axis (YXZ) |
IA_Move | S (Keyboard) | Negate |
IA_Move | D (Keyboard) | Swizzle Input Axis (YXZ) |
IA_Move | A (Keyboard) | Negate + Swizzle Input Axis (YXZ) |
IA_Jump | Space Bar (Keyboard) | なし |
💡 Modifiersの解説:
IA_MoveはVector2を期待していますが、キーボードのW/S/A/Dは単一の軸(Float)しか出力しません。- W/SはY軸(前後)に、A/DはX軸(左右)にマッピングする必要があります。
Swizzle Input AxisModifiersを使用することで、W/Sの入力をY軸に、A/Dの入力をX軸に変換できます。NegateModifiersは、Sキー(後退)やAキー(左移動)のように、入力値を反転させるために使用します。
Step 4: プレイヤーキャラクターへのIMCの適用
プレイヤーキャラクターのBlueprint(例: BP_ThirdPersonCharacter)を開き、Event BeginPlayでIMCを適用します。
// BP_ThirdPersonCharacter (Event Graph)
// 1. Get Player Controller
// 2. Get Subsystem ノードで EnhancedInputLocalPlayerSubsystem を選択
// 3. Add Mapping Context (Target: Subsystem, Context: IMC_PlayerControls, Priority: 0)
💡 Enhanced Input Subsystemの取得方法
Enhanced Input SubsystemはLocal Player Subsystemの一種です。「Cast to Enhanced Input Player Controller」というノードは存在しません。代わりに、
Get Subsystemノード を使用し、サブシステムクラスとしてEnhancedInputLocalPlayerSubsystemを指定してください。Player Controllerを取得した後、Get Subsystemノードを接続することで、そのプレイヤーに関連付けられたSubsystemインスタンスを取得できます。
Step 5: Input Actionイベントの処理
最後に、IAイベントを処理してキャラクターを動かします。
// BP_ThirdPersonCharacter (Event Graph)
// IA_Moveイベントの処理
// 1. Enhanced Input Action Eventsで IA_Move を検索
// 2. Triggeredピンから Add Movement Input ノードを呼び出す
// 3. Action Value (Vector2) を Break Vector 2D で分解
// 4. X軸の値を Get Right Vector に、Y軸の値を Get Forward Vector に接続し、それぞれ Add Movement Input の World Direction に接続
// 5. Add Movement Input の Scale Value に X軸/Y軸の値を接続
// IA_Jumpイベントの処理
// 1. Enhanced Input Action Eventsで IA_Jump を検索
// 2. Triggeredピンから Jump ノードを呼び出す
// 3. Completedピンから Stop Jumping ノードを呼び出す
TriggersとModifiers
Enhanced Inputの真価は、Triggers(発動条件)とModifiers(入力値の加工)にあります。これらを組み合わせることで、複雑な入力ロジックをBlueprintやC++で組むことなく、アセット側で定義できます。
Input Triggers(発動条件)の例
| Trigger | 説明 | 使用例 |
|---|---|---|
| Held | 一定時間以上キーが押され続けた場合に発動します。 | スキルのチャージ、長押しによるメニュー表示。 |
| Tap | キーが素早く押されて離された場合に発動します。 | ダブルタップによるダッ シュ、素早いアクション。 |
| Chord | 複数のキーが同時に押された場合に発動します。 | L1+R1のような同時押しコマンド。 |
| Down | キーが押された瞬間に発動します(従来のAction Mappingに近い)。 | 通常の攻撃、ジャンプ。 |
Input Modifiers(入力値の加工)の例
| Modifier | 説明 | 使用例 |
|---|---|---|
| Dead Zone | スティックの遊び(デッドゾーン)を設定し、意図しない入力を無視します。 | ゲームパッドのスティック操作。 |
| Negate | 入力値を反転させます(例: 1.0を-1.0に)。 | 後退操作、視点操作のY軸反転。 |
| Swizzle Input Axis | 入力ベクトルの軸を入れ替えます(例: XとYを入れ替える)。 | キーボードのW/S/A/D入力をVector2にマッピングする際。 |
| Smooth | 入力値に滑らかさを加え、急激な入力変化を緩和します。 | 視点操作の加速・減速。 |
ベストプラクティスとよくある間違い
✅ ベストプラクティス:コンテキストの活用
Enhanced Inputの最大の利点は、IMCを動 的に切り替えられることです。
- IMCの分割: 「
IMC_PlayerControls(基本操作)」「IMC_Driving(運転操作)」「IMC_UI(メニュー操作)」のように、ゲームのコンテキスト ごとにIMCを分割します。 - 優先度 (Priority) の設定: 複数のIMCが同時に有効になる場合(例: 運転中にUIも操作できる場合)、
Add Mapping Contextノードで優先度を設定し、競合を防ぎます。優先度の高いIMCのマッピングが優先されます。
❌ よくある間違い:Input ActionのValue Typeの誤設定
IAを作成する際、Value Typeを適切に設定しないと、意図した入力値を取得できません。
- Digital (Bool): ジャンプ、攻撃など、ON/OFFの二値入力(キーボードのキー、ボタン)。
- Axis1D (Float): スロットル、トリガーなど、単一軸の連続値入力。
- Axis2D (Vector2): 移動、視点操作など、2軸の連続値入力。
キーボードのWキーをAxis2DのIAに割り当てた場合、WキーはFloat値(1.0)を出力します。これをVector2のY軸にマッピングするには、前述の通りSwizzle Input Axis Modifierが必須になります。このModifierを忘れると、入力が機能しない原因となります。
Enhanced Input System活用のポイント
Unreal Engine 5のEnhanced Input Systemは、従来の入力システムが抱えていた管理の煩雑さや柔軟性の欠如といった問題を根本的に解決する強力なフレームワークです。
- Input Action (IA) で「何をしたいか」を抽象化し、Input Mapping Context (IMC) で「どう実現するか」を分離。
- Triggers とModifiers を活用することで、複雑な入力ロジックをアセット側で簡単に定義可能。
- IMCを動的に切り替えることで、ゲームのコンテキストに応じた入力管理を容易に実現。
UE5でのゲーム開発においては、Enhanced Input Systemをマスターすることが、快適でメンテナンス性の高い入力システムを構築するための鍵となります。ぜひ、あなたのプロジェクトで活用してみてください。