UnityのInputSystemの使い方

まずはPackageManagerからInputSystemをインストールします。

インストールが終わったら、Project SettingsのPlayerの「Active Input Handling」が「Input System Package」になっていることを確認しておきましょう。

InputActionsの作成

メニューのAssets→Create→Input ActionsでInputActionsを作成します。作成したファイルをダブルクリックすると以下のような画面が開きます。

プレイヤーの移動とボタンのアクションマップを追加したいと思います。Action Mapsの右の+をクリックして名前を入力します。

方向キーの割り当て

移動用のアクションは、ゲームパッドの十字キー、左スティック、キーボードの↑↓←→を割り当てたいと思います。デフォルトでついている名前「New action」をわかりやすい名前「Move」などに変更します。「Action Type」に「Value」、「Control Type」に「Vector 2」を選択します。

<No Binding>をクリックして、「Path」に[Gamepad]の「D-Pad」を選択します。

Moveの横の+をクリックして「Add Binding」を選択し、D-Padの追加と同じ要領で「Path」に[Gamepad]の「Left Stick」を選択します。

キーボードの↑↓←→を割り当てるには、Moveの横の+をクリックして「Add 2D Vector Composite」を選択し、「UP」、「Down」、「Left」、「Right」それぞれの「Path」に[Keyboard]の「Up Arrow」、「Down Arrow」、「Left Arrow」「Right Arrow」を選択します。

ボタンの割り当て

ボタンのアクションは、ゲームパッドのボタン、キーボードのスペースキーを割り当てたいと思います。Actionsの横の+をクリックしてアクションを追加します。「Action Type」に「Button」を選択します。

<No Binding>をクリックして、「Path」に[Gamepad]の「Button East」を選択します。

Shotの横の+をクリックして「Add Binding」を選択し、「Path」に[Keyboard]の「Space」を選択します。

Auto-Saveにチェックを入れてウィンドウを閉じます。

入力の取得

Inspectorの「Generate C# Class」にチェックを入れて、「Apply」ボタンをクリックするとClassファイルが作成されます。

従来のInputManagerと同じようなスタイルで入力を取得するには、以下のようにします。他にもコールバックで入力を取得する方法もあるようです。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;

public class PlayerController : MonoBehaviour
{
    private static readonly float Speed = 2.0f;
    private InputControls _inputControls;

    void Awake()
    {
        // Inspectorで生成したクラス
        this._inputControls = new InputControls();
        this._inputControls.Enable();
    }

    void Update()
    {
        // 方向キーの入力取得
        Vector2 stickVector2 = this._inputControls.Player.Move.ReadValue<Vector2>();
        // 上下左右に動かす
        transform.Translate(stickVector2 * Speed * Time.deltaTime);

        // ボタン押下判定
        if (this._inputControls.Player.Shot.ReadValue<float>() >= InputSystem.settings.defaultButtonPressPoint)
        {
            // ボタンが押された時の処理
        }
    }

    void OnDestroy()
    {
        this._inputControls.Dispose();
    }
}