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.GetKey
やInput.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.GetKey 、Input.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の利用方法と、その柔軟性・拡張性、さらに安全な実装のためのキーボード存在チェックについてご理解いただければ幸いです。
ディスカッション
コメント一覧
まだ、コメントがありません