バッテラが如く

プログラミングしましょ!

【Unity】InputSystemの基本的な使い方 (エディタで入力検知を作る新しい入力システム)

Unity

はじめに

InputSytemはキーボードやマウスなどの入力を検知するためのライブラリです。

キー入力というとInput.GetMouseDownというやり方が一般的ですがそれは旧式で、 InputSystemは新しい入力検知システムになります。現時点(2022/05/17)ではどちらも共存できます。

ちらっとドキュメント見る限りなんだか難しそうだなぁということで先送りしてました。

試しにやってみたので基本的に使い方をかいつまんで解説しようかと思います。

この記事ではどういうものかだけをさらっとやります。深くはやりません。ちゃんと別記事で1つ1つやります。

環境

この記事の情報は次のバージョンで動作確認しています。

* MacOS Monterey (12.1)
* Unity (2021.3.2f1)
* Input System(v1.3.0)

InputSystemのインストール

InputSystemはデフォルトで使える機能ではなく、PackageManagerからインストールが必要です。

既にインストール済みであればこの項目自体をスキップしてもらってよいです。

まず Window → Package Managerと進みます。

PackagesのプルダウンをUnity Registryに変更

検索バーに Input と打ち込み Enter押します

インストール完了後、Unity再起動を促すダイアログが表示されます。

[YES]を選択するとUnityが自動で再起動されます。

これでInputSystemを使う準備が整いました。

InputActionファイルを作成する

InputSystemではコードによる入力検知もできますが本筋ではありません。入力検知をエディタ上で作ることができるのでそれを今回やりたいと思います。

入力検知をするGameObjectPlayerInputをアタッチします。プレイヤーキャラなど動かすキャラにすればOKです

Create Actions ボタンを押下します

InputActionファイルを作る場所を選びます。場所はどこでもよいです。

自動でそのファイルがアタッチされます(CreateActionsの時のみです、本来は手動でセットが必要)

InputActionを実装する

InputActionをクリックし、Edit asset をクリックします

各項目について簡単に説明したいと思います
※CreateActionsで作るとデフォルトで用意されています。

① Action Map

ディレクトリみたいなものです。Actionsを持つ親という位置付けです。

② Action

行動ごとにActionを作るということだけ覚えればいいです

例)移動、ジャンプ、しゃがむなど

③ Action Property

ここの理解がまだ追いついていないのです

まずAction Typeは「Value」と「Button」のどちらかを選びます。

Value」は押し続けて使うもの => 移動などが当てはまる

「Button」は単発押し => 攻撃などが当てはまる

Control Type は スクリプトで取得する時に使います。正直気にしなくていいです

④ Binding

バイス(Keyboard、GamePad)を登録していくイメージ

Action1つに対して複数のBindingを持つことができます

⑤ Binding Property

「Path」の部分で何を検知するのかを選ぶイメージ

以上がInputAtionのさわりの部分になります。

かなり深くやりたいことによって手順が全然違うので、とりあえずこういうものだという理解でいいです。

各操作ごとに別の記事で紹介していこうと思います。

スクリプトでイベント取得するには

最後に検知した際のコールバックをスクリプトで紐付けするプログラムを書いていきます。

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

public class Sample : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        var input = this.GetComponent<PlayerInput>();
        var actionMap = input.currentActionMap;
        var moveAction = actionMap["Move"];

        moveAction.performed += MoveAction_performed;
    }


    private void MoveAction_performed(InputAction.CallbackContext obj)
    {
        Debug.Log("perfomed");
    }

}

このように

従来のInputが使うとエラーが起きる

InputSystemに変更すると従来のUnityEngine.InputAPIが使用できなくなります。

使用すると実行時に InvalidOperationException が発生します。

従来のInputが使えなくなるわけではないので安心してください。

以下の対応をすると解決します。

PlayerSettingsを開き Active Input Handling の項目をBothに切り替えると両方のInputが使えるようです

過去のコードを流用しないといけない案件の場合は、Bothにしないとダメですね。