Unityの新しいInput Systemによる入力処理とInputManagerとの比較

本資料では、Unityの新しいInput Systemを用いた入力処理のサンプルコードとその詳細な解説、さらに従来のInputManagerとの比較についてまとめています。


1. サンプルコード例

以下は、新しいInput Systemを活用して、Wキーおよびスペースキーの入力状態を検出する基本的なサンプルコードです。

using UnityEngine;
using UnityEngine.InputSystem;

public class SphereController : MonoBehaviour
{
    void Update()
    {
        if (Keyboard.current.wKey.isPressed)
        {
            Debug.Log("Wキーが押され続けている");
        }

        if (Keyboard.current.spaceKey.wasPressedThisFrame)
        {
            Debug.Log("スペースキーが一回だけ押された");
        }
    }
}

2. コードの詳細な説明

2.1 名前空間のインポート

  • using UnityEngine;
    Unityの基本的な機能(ゲームオブジェクト、コンポーネントなど)を利用するための名前空間です。
  • using UnityEngine.InputSystem;
    新しいInput Systemにアクセスするための名前空間です。これにより、Keyboard.current などのAPIを使って、各種デバイスの入力状態を直接取得できます。

2.2 クラス定義と継承

  • public class SphereController : MonoBehaviour
    このクラスはMonoBehaviourを継承しており、Unityのコンポーネントとしてゲームオブジェクトにアタッチすることで動作します。

2.3 Updateメソッド

  • void Update()
    UnityのUpdateメソッドは毎フレーム実行されるため、この中で常に入力の状態がチェックされ、条件に応じた処理が行われます。

2.4 キーボード入力の検出

Wキーの検出

if (Keyboard.current.wKey.isPressed)
{
    Debug.Log("Wキーが押され続けている");
}
  • 動作:
    Keyboard.current.wKey.isPressed はWキーが現在押され続けているかどうかを判断します。Wキーが押されている状態が持続している場合、毎フレームこの条件が真となり、コンソールに「Wキーが押され続けている」と表示されます。

スペースキーの検出

if(Keyboard.current.spaceKey.wasPressedThisFrame)
{
    Debug.Log("スペースキーが一回だけ押された");
}
  • 動作:
    Keyboard.current.spaceKey.wasPressedThisFrame は、スペースキーがそのフレームで初めて押された瞬間を捉えます。スペースキーが押された瞬間のみ、コンソールに「スペースキーが一回だけ押された」というログが出力されます。

3. InputManager(旧システム)との比較

3.1 従来のInputManagerの特徴

  • 静的メソッドによる入力取得
    旧システムでは、Input.GetKeyInput.GetKeyDown などの静的メソッドを用いて入力状態を取得します。
    例:
if (Input.GetKey(KeyCode.W))
{
    Debug.Log("Wキーが押され続けている");
}

if (Input.GetKeyDown(KeyCode.Space))
{
    Debug.Log("スペースキーが一回だけ押された");
}
  • エディタ上の設定に依存
    入力はUnityエディタ内のInput Managerで事前に設定され、その設定に基づいてコード内で入力処理が行われます。
  • シンプルだが拡張性に限界がある
    単純な入力検出には十分な一方、複数デバイスの対応やキーの再割り当て、複雑な入力処理には不向きな場合があります。

3.2 新しいInput Systemの特徴

  • オブジェクト指向の入力取得
    Keyboard.current のように、現在のデバイスの入力状態に直接アクセスでき、入力状態をオブジェクトとして管理できるため、直感的な操作が可能です。
  • 柔軟な入力アクションの設定
    キーバインドの変更、複数デバイスの同時利用、入力コンテキストの切り替えなど、柔軟な設定が容易です。
  • イベント駆動型の入力処理
    wasPressedThisFrame のようなプロパティにより、入力が発生した瞬間を正確に検出し、即座に反応する処理が書けます。
  • 拡張性と統一性
    ゲームパッド、タッチ入力、その他のデバイスにも同一のAPIでアクセスできるため、マルチデバイス対応がシンプルに実現できます。

3.3 比較まとめ

項目InputManager(旧システム)新しいInput System
設定方法エディタ上での事前設定が必要コード上やエディタ上で柔軟に設定可能
入力取得方法静的メソッド(Input.GetKeyInput.GetKeyDown)を使用オブジェクト指向で、デバイス状態に直接アクセス
柔軟性・拡張性単純なケースには適するが、複雑な処理には制約がある複数デバイス対応や複雑な入力処理に優れる

4. 追加情報:キーボードの存在チェックの推奨

ターゲットがPC以外のデバイスの場合、キーボードが接続されていない可能性も考慮する必要があります。
そのため、以下のようにキーボードが有効な場合のみ入力チェックを行う方法を採用すると、NullReferenceExceptionなどのエラーを防ぐことができます。

using UnityEngine;
using UnityEngine.InputSystem;

public class SphereController : MonoBehaviour
{
    void Update()
    {
        if (Keyboard.current != null)
        {
            if (Keyboard.current.wKey.isPressed)
            {
                Debug.Log("Wキーが押され続けている");
            }

            if (Keyboard.current.spaceKey.wasPressedThisFrame)
            {
                Debug.Log("スペースキーが一回だけ押された");
            }
        }
        else
        {
            Debug.Log("キーボードが接続されていません");
        }
    }
}
  • チェックのポイント:
    if (Keyboard.current != null) により、キーボードが接続されているかどうかを確認しています。
    キーボードが接続されていない場合は、エラーログを出力するなどの対処が可能です。

5. まとめ

  • 新しいInput System
    • 直感的なオブジェクト指向の入力取得により、各種デバイスの入力管理が容易になります。
    • 柔軟な設定やイベント駆動型の入力処理が可能で、複雑なシナリオに対しても効果的に対応できます。
    • キーボードが接続されているかのチェックを行うことで、プラットフォームごとの差異にも安全に対応できます。
  • InputManager(旧システム)
    • シンプルで基本的な入力検出には十分ですが、複雑な入力やマルチデバイス対応には限界があります。

この資料を通じて、Unityの新しいInput Systemの利用方法と、その柔軟性・拡張性、さらに安全な実装のためのキーボード存在チェックについてご理解いただければ幸いです。

Input System,Unity

Posted by hidepon