リンドくんたなべ先生、Unityでゲームを作ってるんですけど、PCでもスマホでもコントローラーでも遊べるようにしたいんです。でも、それぞれの操作方法をどう実装すればいいか分からなくて...
たなべそういう時こそInput Systemの出番なんだ。
この仕組みを使えば、キーボード、タッチ、ゲームパッドなど、異なる入力デバイスを一つのシステムで管理できるんだよ。
現代のゲーム開発において、マルチプラットフォーム対応は避けて通れない課題となっています。
プレイヤーはPCでキーボードとマウスを使って遊んだり、スマホでタッチ操作をしたり、ゲームコントローラーを接続して遊んだり、様々なデバイスでゲームを楽しみたいと考えています。
しかし、従来のUnityの入力システム(Input Manager)では、各デバイスごとに異なる入力処理を書く必要があり、コードが複雑になりがちでした。そんな問題を解決するのが新しいInput Systemです。
この記事では、Unity初心者の方でも理解できるよう、Input Systemを使ったマルチプラットフォーム対応の基本から実装方法まで、段階的に解説していきます。
Input Systemとは何か?
リンドくんそもそもInput Systemって、従来の方法と何が違うんですか?
たなべ一番の違いは「アクション」という概念なんだ。
従来は「スペースキーが押されたか」を直接チェックしていたけど、Input Systemでは「ジャンプアクションが実行されたか」という形で考えるんだよ。
Input Systemの基本概念
Input Systemは、Unityが提供する新しい入力管理システムです。従来のInput Managerを置き換えるもので、以下のような特徴があります。
- アクションベースの設計 - 「ジャンプ」「移動」などの抽象的なアクションを定義し、それに各デバイスの入力を紐付けます
- マルチデバイス対応 - 一つのアクションに複数のデバイスからの入力を割り当てられます
- Control Scheme(コントロールスキーム) - デバイスごとの操作セットを簡単に切り替えられます
- イベント駆動型 - 入力の変化をイベントとして受け取れるため、効率的な処理が可能です
なぜマルチプラットフォーム対応が簡単になるのか
従来の方法では、こんなコードを書く必要がありました。
// 従来の方法
void Update()
{
// PC用の入力
if (Input.GetKeyDown(KeyCode.Space))
{
Jump();
}
// スマホ用の入力
if (Input.touchCount > 0 && Input.GetTouch(0).phase == TouchPhase.Began)
{
Jump();
}
// ゲームパッド用の入力
if (Input.GetButtonDown("Jump"))
{
Jump();
}
}Input Systemを使えば、以下のようにシンプルになります。
// Input Systemの方法
public InputAction jumpAction;
void OnEnable()
{
jumpAction.performed += ctx => Jump();
jumpAction.Enable();
}
void OnDisable()
{
jumpAction.Disable();
}このコードでは、jumpActionに対してどのデバイスからの入力でも同じ処理が実行されます。デバイスごとの分岐処理が不要になるため、コードがシンプルで保守しやすくなるのです。
Input Systemのメリット
Input Systemを導入することで、以下のようなメリットが得られます。
- コードの可読性向上 - デバイスごとの分岐が減り、意図が明確になります
- 保守性の向上 - 入力設定を一箇所で管理できるため、変更が容易です
- 拡張性の向上 - 新しいデバイスへの対応が簡単に追加できます
- パフォーマンスの向上 - イベント駆動型のため、不要なポーリングが減ります
Input Systemのセットアップ方法
リンドくん実際に使うにはどうすればいいんですか?
たなべUnity6からはInput Systemはデフォルトで使えるようになっているよ!
逆に従来のInput Managerは設定しないと使えないようになっているからそこだけ注意してね。
従来のInput Managerを使う場合
従来のInput Managerを有効にするには、プロジェクト設定を変更する必要があります。
-
Project Settingsを開く
- ツールバーの
Edit > Project Settingsを選択
- ツールバーの
-
Player設定に移動
- 左側のメニューから
Playerを選択
- 左側のメニューから
-
Active Input Handlingを変更
Other Settingsセクションを展開Active Input Handlingを以下のいずれかに設定Input Manager (Old)- Input Managerのみ使用Both- 新旧両方を使用
この設定変更後も、Unityエディタの再起動が必要になる場合があります。
Input Actions Assetの作成
Input Systemでは、入力設定をInput Actions Assetというファイルで管理します。
-
Assetの作成
- Projectウィンドウで右クリック
Create > Input Actionsを選択- 分かりやすい名前(例:
PlayerInputActions)を付けます
-
Assetをダブルクリックして開く
- Input Actions Editorウィンドウが開きます
-
最初のAction Mapを作成
- デフォルトで作成されることもありますが、なければ
+ボタンでAction Mapを追加 - 名前を「Player」などに設定します
- デフォルトで作成されることもありますが、なければ
これで、Input Systemを使用する準備が整いました!
Action MapとActionの基本
リンドくんAction Mapって何ですか?Actionとは違うんですか?
たなべAction Mapは入力のグループで、Actionは個別の操作なんだ。
例えば「ゲームプレイ用の入力」というAction Mapの中に、「移動」「ジャンプ」「攻撃」といった個別のActionがある、という感じだね。
Action Mapとは
Action Mapは、関連する複数のActionをグループ化したものです。ゲームの状態に応じて、有効にするAction Mapを切り替えることができます。
例えば、以下のようなAction Mapを作ることが一般的です。
- Player - ゲームプレイ中の操作(移動、ジャンプ、攻撃など)
- UI - メニュー操作(決定、キャンセル、カーソル移動など)
- Vehicle - 乗り物操作(アクセル、ブレーキ、ステアリングなど)
Actionの作成方法
Input Actions Editorで実際にActionを作成してみましょう。
-
Action Mapを選択
- 左側のパネルから「Player」Action Mapを選択
-
新しいActionを追加
- Action Map内で右クリックまたは
+ボタンをクリック Add Actionを選択
- Action Map内で右クリックまたは
-
Actionの名前を設定
- 例:「Move」「Jump」「Attack」など
-
Action Typeを設定
- Value - 連続的な値(移動方向、アナログスティックなど)
- Button - ボタンの押下(ジャンプ、攻撃など)
- Pass Through - すべての入力値をそのまま渡す
Bindingの追加
Actionに対して、実際のデバイス入力を紐付けるのがBindingです。
例:「Jump」Actionに対するBinding
- キーボード: スペースキー
- ゲームパッド: Aボタン(Xbox)/ ×ボタン(PlayStation)
- タッチ: 画面タップ
Bindingを追加する手順は以下の通りです。
-
Actionを選択
- 右側のパネルに詳細が表示されます
-
Bindingを追加
+ボタンをクリックしてAdd Bindingを選択
-
入力デバイスを選択
Pathフィールドをクリック- 使用したいデバイスと入力を選択
- 例:
Keyboard > Space、Gamepad > Button Southなど
複数のBindingを追加することで、一つのActionに複数のデバイスからの入力を割り当てられます。これがマルチプラットフォーム対応の鍵となります!
Control Schemeでデバイス切り替えを実現
リンドくんPCとゲームパッドで違う操作にしたいときはどうすればいいんですか?
たなべそれにはControl Schemeを使うんだ!
これを使えば、「キーボード+マウス用」「ゲームパッド用」「タッチ用」といったデバイスセットごとの操作体系を定義できるよ。
Control Schemeとは
Control Scheme(コントロールスキーム)は、特定のデバイスセットに対する操作体系を定義するものです。例えば以下のようなスキームを作成できます。
- Keyboard&Mouse - PCでの標準的な操作
- Gamepad - コントローラーでの操作
- Touch - スマホやタブレットでの操作
各Control Schemeには、使用するデバイスの種類と、そのスキーム専用のBindingを設定できます。
Control Schemeの作成方法
Input Actions Editorで Control Schemeを作成してみましょう。
-
Control Schemesタブを選択
- Input Actions Editorの上部にあるタブから選択
-
新しいSchemeを追加
+ボタンをクリック- 名前を設定(例:「Keyboard&Mouse」)
-
使用するデバイスを追加
Add Deviceをクリック- 使用したいデバイスタイプを選択
- Keyboard(キーボード)
- Mouse(マウス)
- Gamepad(ゲームパッド)
- Touchscreen(タッチスクリーン)など
-
必須・オプションの設定
Requiredにチェックを入れると、そのデバイスが必須になります- 例:Keyboard&Mouseスキームでは、KeyboardとMouseを両方Requiredに設定
BindingにControl Schemeを適用
各BindingにControl Schemeを割り当てることで、特定のスキームでのみ有効な入力を定義できます。
-
Actionを選択し、Bindingを表示
-
Bindingの詳細を開く
- 右側のパネルでBindingの設定を確認
-
Control Schemeを選択
Control Schemeドロップダウンから適用するスキームを選択- 複数選択も可能です
例えば、「Move」Actionに対して以下のように設定できます。
Move Action:
├─ WASD (Keyboard&Mouse スキーム)
│ └─ Composite: 2D Vector
│ ├─ Up: W
│ ├─ Down: S
│ ├─ Left: A
│ └─ Right: D
│
├─ Left Stick (Gamepad スキーム)
│ └─ Gamepad > Left Stick
│
└─ Touch (Touch スキーム)
└─ On-Screen Stick
このように設定することで、プレイヤーが使用しているデバイスに応じて、自動的に適切な入力が選択されるのです!
実装例 キャラクター移動をマルチデバイス対応にする
リンドくん実際のコードではどう書けばいいんですか?
たなべじゃあ、実際にキャラクターを動かすコードを書いてみようか。
Input Systemを使えば、どのデバイスから入力されても同じコードで処理できるんだよ。
Input Actions Assetの設定
まず、Input Actions Assetで以下の設定を行います。
-
Action Mapの作成
- 名前:
Player
- 名前:
-
Moveアクションの作成
- Action Type:
Value - Control Type:
Vector2
- Action Type:
-
Bindingの追加
Keyboard&Mouse用(2D Vector Composite)
Up: W
Down: S
Left: A
Right: D
Gamepad用
Left Stick [Gamepad]
-
Jumpアクションの作成
- Action Type:
Button
- Action Type:
-
Bindingの追加
Keyboard&Mouse用
Space [Keyboard]
Gamepad用
Button South [Gamepad] // XboxならA、PlayStationなら×
C#スクリプトの実装
次に、実際にキャラクターを動かすスクリプトを作成します。
using UnityEngine;
using UnityEngine.InputSystem;
public class PlayerController : MonoBehaviour
{
// 移動速度
[SerializeField] private float moveSpeed = 5f;
// ジャンプ力
[SerializeField] private float jumpForce = 5f;
// 地面判定用
[SerializeField] private bool isGrounded = true;
// Rigidbodyコンポーネント
private Rigidbody rb;
// 入力値を保持
private Vector2 moveInput;
void Start()
{
rb = GetComponent<Rigidbody>();
}
void FixedUpdate()
{
// 移動処理
Vector3 movement = new Vector3(moveInput.x, 0f, moveInput.y);
rb.velocity = new Vector3(
movement.x * moveSpeed,
rb.velocity.y,
movement.z * moveSpeed
);
}
// 移動入力を受け取る(どのデバイスからでもOK)
public void OnMove(InputAction.CallbackContext context)
{
moveInput = context.ReadValue<Vector2>();
}
// ジャンプ入力を受け取る(どのデバイスからでもOK)
public void OnJump(InputAction.CallbackContext context)
{
// ボタンが押された瞬間のみ反応
if (context.performed && isGrounded)
{
rb.AddForce(Vector3.up * jumpForce, ForceMode.Impulse);
isGrounded = false;
}
}
// 地面に着地したら再度ジャンプ可能にする
void OnCollisionEnter(Collision collision)
{
if (collision.gameObject.CompareTag("Ground"))
{
isGrounded = true;
}
}
}Player Input コンポーネントの設定
スクリプトを書いたら、Unityエディタで設定を行います。
-
Player Input コンポーネントを追加
- キャラクターオブジェクトを選択
Add Component > Player Input
-
Input Actions Assetを割り当て
Actionsフィールドに作成したInput Actions Assetをドラッグ&ドロップ
-
Behaviorを設定
BehaviorをInvoke Unity Eventsに設定- これにより、イベントとしてメソッドを呼び出せます
-
イベントの割り当て
Eventsセクションを展開PlayerAction Mapを展開Moveアクションの+ボタンをクリック- キャラクターオブジェクトをドラッグ&ドロップ
PlayerController > OnMoveを選択- 同様に
JumpアクションにもOnJumpを割り当て
これで完成です!キーボード、ゲームパッド、どちらで操作してもキャラクターが動くようになりました。
コードのポイント解説
このコードの重要なポイントは以下の通りです。
InputAction.CallbackContext- 入力の状態(開始、実行中、終了)を含む情報が渡されますcontext.ReadValue<T>()- 入力値を指定した型で取得しますcontext.performed- ボタンが押された瞬間を検出します- デバイス非依存 - どのデバイスからの入力でも同じコードで処理できます
従来の方法と比べて、コードが圧倒的にシンプルになったことが分かるのではないでしょうか。
よくある問題と解決法
リンドくん実装してみたんですけど、うまく動かないことがあります...
たなべInput Systemは便利だけど、設定ミスで動かないこともあるんだよね。
よくある問題と解決法を見ていこうか。
問題1 入力が反応しない
症状: キーやボタンを押しても何も起きない
解決法
-
Player Input コンポーネントを確認
ActionsフィールドにInput Actions Assetが割り当てられているかDefault Mapが正しく設定されているか
-
Action Mapが有効か確認
- スクリプトで明示的に有効化する必要がある場合があります
csharp void OnEnable() { playerInput.actions.Enable(); } void OnDisable() { playerInput.actions.Disable(); } -
イベントの割り当てを確認
- Player InputコンポーネントのEventsセクションで、正しくメソッドが割り当てられているか
問題2 特定のデバイスでのみ動かない
症状: キーボードでは動くがゲームパッドでは動かない(またはその逆)
解決法
-
Bindingを確認
- Input Actions EditorでBindingが正しく設定されているか
- Control Schemeが適切に割り当てられているか
-
デバイスの接続を確認
- ゲームパッドが正しく接続されているか
- Windowsの「デバイスとプリンター」で確認できます
-
Control Schemeの自動切り替えを確認
- Player Inputコンポーネントの
Auto Switchが有効になっているか
- Player Inputコンポーネントの
問題3 複数のデバイスが同時に反応してしまう
症状: キーボードとゲームパッドの両方で操作すると、両方が反応してしまう
解決法
-
Control Schemeを適切に設定
- 各BindingにControl Schemeを明示的に割り当てる
-
Player Inputの設定を変更
Auto Switchを有効にすると、最後に使用したデバイスが優先されます
問題4 Input Actions Assetの変更が反映されない
症状: Input Actions Editorで設定を変更したのに、ゲームに反映されない
解決法
-
保存とコンパイルを確認
- Input Actions Editorで
Save Assetボタンをクリック - C#スクリプトの自動生成を待つ
- Input Actions Editorで
-
C#クラスの自動生成を有効化
- Input Actions Assetを選択
- Inspectorで
Generate C# Classにチェック Applyをクリック
これらの解決法を試しても問題が解決しない場合は、一度Unityエディタを再起動してみてください。設定が正しく読み込まれることがあります。
まとめ
リンドくんInput Systemって最初は難しそうでしたけど、慣れると本当に便利ですね!
たなべそうなんだよ!最初の設定は少し手間だけど、一度作ってしまえばどんなデバイスにも簡単に対応できるからね。
マルチプラットフォーム開発には欠かせないツールだよ。
Input Systemを使ったマルチプラットフォーム対応について、基本から実装まで解説してきました。重要なポイントを振り返ってみましょう。
Input Systemの主な利点は以下です。
- アクションベースの設計 により、デバイス非依存のコードが書けます
- Control Scheme でデバイスごとの操作体系を簡単に管理できます
- 一つのコードで複数デバイスに対応 でき、保守性が向上します
- イベント駆動型 の処理で、効率的な入力管理が可能です
実装のポイント
- Input Actions Assetで入力を定義し、一元管理します
- Action Mapでゲームのモードごとに入力を切り替えられます
- Bindingで各デバイスの具体的な入力を紐付けます
- C#スクリプトではデバイスを意識せず、Actionの結果だけを処理します
現代のゲーム開発では、プレイヤーが好きなデバイスで遊べることが重要です。Input Systemを使いこなすことで、より多くのプレイヤーにゲームを届けることができます。
最初は設定項目の多さに戸惑うかもしれませんが、一度理解してしまえば、これほど強力なツールはありません。
ぜひ実際のプロジェクトで試してみて、マルチプラットフォーム対応の便利さを実感してください!





