Unity_Lesson

1.Input Systemを使用し、「Action」に登録した入力を検知する

キャラクターの『移動』や『ジャンプ』などといった操作を「Action」として扱います





例えば、PCであればスペースキー、GamePadであればButton South(XBoxコントローラーならAボタン。SwitchコントローラーならBボタン)を押せば、『ジャンプ』という「Action」を行うことができます





* これから色々とややこしく感じるかもしれませんが、
「InputActionというクラスを作成。入力やActionの設定をインスタンス化。そのインスタンから入力情報を操る」という考え方は、Input Systemを使うにあたってずっと変わりません。

先の文章の意味も今は理解不能でも少しずつ慣れていきましょう。



2. インスペクターから入力を設定し、「Action」の入力値をログ出力してみましょう

適当なゲームオブジェクトにアタッチしてください

InputActionExample.cs


using UnityEngine;
using UnityEngine.InputSystem;

public class InputActionExample : MonoBehaviour
{
    // Actionをインスペクターから編集できるようにする
    [SerializeField] private InputAction _action;

    // 有効時、実行
    private void OnEnable()
    {
        // InputActionを有効化。 これをしないと入力を受け取れないことに注意
        _action?.Enable();
    }

    // 無効時などに実行
    private void OnDisable()
    {
        // 無効化されるタイミングなどで、Actionを無効化
        _action?.Disable();
    }

    //破壊された時など
    private void OnDestroy()
    {
        _action?.Dispose();// 破壊された時などに、Actionを無効化
    }

    private void Update()
    {
        if (_action == null) return;

        // Actionの入力値(指定した型と一致するもの)を読み込む
        var value = _action.ReadValue<float>();

        // 入力値をログ出力
        Debug.Log($"Actionの入力値 : {value}");
    }
}


例として、スペースキーをBindingとして追加してみましょう。



インスペクタからActionを編集していきます。

Action右の「+」アイコンをクリックし、Add Bindingを選択

Path右のドロップダウンをクリック

Listenボタンから実際に入力されたキーで割り当てることができます。
もしくは、その下の一覧から手動で選択することもできます。
スペースキーを割り当ててみて下さい


以下のように設定できたら実行確認してください

float型(1軸)の入力値として受け取っているため、0か1の値が出力されると思います。

ゲームパッドのトリガーボタンやスティックなどアナログ入力を割り当てた場合は0~1の間の値が出力されます。


スクリプトについて

// Actionをインスペクターから編集できるようにする
[SerializeField] private InputAction _action;

インスペクターからActionを編集できるようにフィールドを定義しています。
その後、インスペクターからActionを設定すると、実行時にInputActionインスタンスが生成されます。

ただし、このままでは入力値を受け取れず、以下処理でオブジェクトが有効化されたタイミングなどでInputAction自身を有効化する必要があります。

// 有効化
private void OnEnable()
{
    // InputActionを有効化
    // これをしないと入力を受け取れないことに注意
    _action?.Enable();
}

これにより、次のコードでActionから入力値を受け取れるようになります。

// Actionの入力値を読み込む
var value = _action.ReadValue<float>();

InputAction.ReadValueメソッドによって入力値を受け取れますが、テンプレート引数はActionで指定した型と一致する必要があります。 [公式サイト](https://docs.unity3d.com/Packages/com.unity.inputsystem@1.5/api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_ReadValue__1)

例ではスペースキー(1軸入力)なので、float型としています。