フリーキーズ | 独学プログラミング

Unity Input Systemの基本の使い方!PC・スマホ・コントローラー操作を一元管理する方法

リンドくん

リンドくん

たなべ先生、Unityでゲームを作ってるんですけど、PCでもスマホでもコントローラーでも遊べるようにしたいんです。でも、それぞれの操作方法をどう実装すればいいか分からなくて...

たなべ

たなべ

そういう時こそInput Systemの出番なんだ。
この仕組みを使えば、キーボード、タッチ、ゲームパッドなど、異なる入力デバイスを一つのシステムで管理できるんだよ。

現代のゲーム開発において、マルチプラットフォーム対応は避けて通れない課題となっています。
プレイヤーはPCでキーボードとマウスを使って遊んだり、スマホでタッチ操作をしたり、ゲームコントローラーを接続して遊んだり、様々なデバイスでゲームを楽しみたいと考えています。

しかし、従来のUnityの入力システム(Input Manager)では、各デバイスごとに異なる入力処理を書く必要があり、コードが複雑になりがちでした。そんな問題を解決するのが新しいInput Systemです。

この記事では、Unity初心者の方でも理解できるよう、Input Systemを使ったマルチプラットフォーム対応の基本から実装方法まで、段階的に解説していきます。

プログラミング学習でお悩みの方へ

HackATAは、エンジニアを目指す方のためのプログラミング学習コーチングサービスです。 経験豊富な現役エンジニアがあなたの学習をサポートします。

✓ 質問し放題

✓ β版公開中(2025年内の特別割引)

HackATAの詳細を見る

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を有効にするには、プロジェクト設定を変更する必要があります。

  1. Project Settingsを開く

    • ツールバーのEdit > Project Settingsを選択
  2. Player設定に移動

    • 左側のメニューからPlayerを選択
  3. Active Input Handlingを変更

    • Other Settingsセクションを展開
    • Active Input Handlingを以下のいずれかに設定
      • Input Manager (Old) - Input Managerのみ使用
      • Both - 新旧両方を使用

この設定変更後も、Unityエディタの再起動が必要になる場合があります。

Input Actions Assetの作成

Input Systemでは、入力設定をInput Actions Assetというファイルで管理します。

  1. Assetの作成

    • Projectウィンドウで右クリック
    • Create > Input Actionsを選択
    • 分かりやすい名前(例:PlayerInputActions)を付けます
  2. Assetをダブルクリックして開く

    • Input Actions Editorウィンドウが開きます
  3. 最初の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を作成してみましょう。

  1. Action Mapを選択

    • 左側のパネルから「Player」Action Mapを選択
  2. 新しいActionを追加

    • Action Map内で右クリックまたは+ボタンをクリック
    • Add Actionを選択
  3. Actionの名前を設定

    • 例:「Move」「Jump」「Attack」など
  4. Action Typeを設定

    • Value - 連続的な値(移動方向、アナログスティックなど)
    • Button - ボタンの押下(ジャンプ、攻撃など)
    • Pass Through - すべての入力値をそのまま渡す

Bindingの追加

Actionに対して、実際のデバイス入力を紐付けるのがBindingです。

例:「Jump」Actionに対するBinding
- キーボード: スペースキー
- ゲームパッド: Aボタン(Xbox)/ ×ボタン(PlayStation)
- タッチ: 画面タップ

Bindingを追加する手順は以下の通りです。

  1. Actionを選択

    • 右側のパネルに詳細が表示されます
  2. Bindingを追加

    • +ボタンをクリックしてAdd Bindingを選択
  3. 入力デバイスを選択

    • Pathフィールドをクリック
    • 使用したいデバイスと入力を選択
    • 例:Keyboard > SpaceGamepad > 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を作成してみましょう。

  1. Control Schemesタブを選択

    • Input Actions Editorの上部にあるタブから選択
  2. 新しいSchemeを追加

    • +ボタンをクリック
    • 名前を設定(例:「Keyboard&Mouse」)
  3. 使用するデバイスを追加

    • Add Deviceをクリック
    • 使用したいデバイスタイプを選択
      • Keyboard(キーボード)
      • Mouse(マウス)
      • Gamepad(ゲームパッド)
      • Touchscreen(タッチスクリーン)など
  4. 必須・オプションの設定

    • Requiredにチェックを入れると、そのデバイスが必須になります
    • 例:Keyboard&Mouseスキームでは、KeyboardとMouseを両方Requiredに設定

BindingにControl Schemeを適用

各BindingにControl Schemeを割り当てることで、特定のスキームでのみ有効な入力を定義できます。

  1. Actionを選択し、Bindingを表示

  2. Bindingの詳細を開く

    • 右側のパネルでBindingの設定を確認
  3. 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で以下の設定を行います。

  1. Action Mapの作成

    • 名前: Player
  2. Moveアクションの作成

    • Action Type: Value
    • Control Type: Vector2
  3. Bindingの追加

Keyboard&Mouse用(2D Vector Composite)

Up: W
Down: S
Left: A
Right: D

Gamepad用

Left Stick [Gamepad]
  1. Jumpアクションの作成

    • Action Type: Button
  2. 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エディタで設定を行います。

  1. Player Input コンポーネントを追加

    • キャラクターオブジェクトを選択
    • Add Component > Player Input
  2. Input Actions Assetを割り当て

    • Actionsフィールドに作成したInput Actions Assetをドラッグ&ドロップ
  3. Behaviorを設定

    • BehaviorInvoke Unity Eventsに設定
    • これにより、イベントとしてメソッドを呼び出せます
  4. イベントの割り当て

    • Eventsセクションを展開
    • PlayerAction Mapを展開
    • Moveアクションの+ボタンをクリック
    • キャラクターオブジェクトをドラッグ&ドロップ
    • PlayerController > OnMoveを選択
    • 同様にJumpアクションにもOnJumpを割り当て

これで完成です!キーボード、ゲームパッド、どちらで操作してもキャラクターが動くようになりました。

コードのポイント解説

このコードの重要なポイントは以下の通りです。

  • InputAction.CallbackContext - 入力の状態(開始、実行中、終了)を含む情報が渡されます
  • context.ReadValue<T>() - 入力値を指定した型で取得します
  • context.performed - ボタンが押された瞬間を検出します
  • デバイス非依存 - どのデバイスからの入力でも同じコードで処理できます

従来の方法と比べて、コードが圧倒的にシンプルになったことが分かるのではないでしょうか。

よくある問題と解決法

リンドくん

リンドくん

実装してみたんですけど、うまく動かないことがあります...

たなべ

たなべ

Input Systemは便利だけど、設定ミスで動かないこともあるんだよね。
よくある問題と解決法を見ていこうか。

問題1 入力が反応しない

症状: キーやボタンを押しても何も起きない

解決法

  1. Player Input コンポーネントを確認

    • ActionsフィールドにInput Actions Assetが割り当てられているか
    • Default Mapが正しく設定されているか
  2. Action Mapが有効か確認

    • スクリプトで明示的に有効化する必要がある場合があります
    void OnEnable()
    {
        playerInput.actions.Enable();
    }
    
    void OnDisable()
    {
        playerInput.actions.Disable();
    }
  3. イベントの割り当てを確認

    • Player InputコンポーネントのEventsセクションで、正しくメソッドが割り当てられているか

問題2 特定のデバイスでのみ動かない

症状: キーボードでは動くがゲームパッドでは動かない(またはその逆)

解決法

  1. Bindingを確認

    • Input Actions EditorでBindingが正しく設定されているか
    • Control Schemeが適切に割り当てられているか
  2. デバイスの接続を確認

    • ゲームパッドが正しく接続されているか
    • Windowsの「デバイスとプリンター」で確認できます
  3. Control Schemeの自動切り替えを確認

    • Player InputコンポーネントのAuto Switchが有効になっているか

問題3 複数のデバイスが同時に反応してしまう

症状: キーボードとゲームパッドの両方で操作すると、両方が反応してしまう

解決法

  1. Control Schemeを適切に設定

    • 各BindingにControl Schemeを明示的に割り当てる
  2. Player Inputの設定を変更

    • Auto Switchを有効にすると、最後に使用したデバイスが優先されます

問題4 Input Actions Assetの変更が反映されない

症状: Input Actions Editorで設定を変更したのに、ゲームに反映されない

解決法

  1. 保存とコンパイルを確認

    • Input Actions EditorでSave Assetボタンをクリック
    • C#スクリプトの自動生成を待つ
  2. 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を使いこなすことで、より多くのプレイヤーにゲームを届けることができます。

最初は設定項目の多さに戸惑うかもしれませんが、一度理解してしまえば、これほど強力なツールはありません。
ぜひ実際のプロジェクトで試してみて、マルチプラットフォーム対応の便利さを実感してください!

この記事をシェア

関連するコンテンツ