はじめに
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
ではコードによる入力検知もできますが本筋ではありません。入力検知をエディタ上で作ることができるのでそれを今回やりたいと思います。
入力検知をするGameObject
にPlayerInput
をアタッチします。プレイヤーキャラなど動かすキャラにすれば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.Input
のAPI
が使用できなくなります。
使用すると実行時に InvalidOperationException
が発生します。
従来のInput
が使えなくなるわけではないので安心してください。
以下の対応をすると解決します。
PlayerSettings
を開き Active Input Handling
の項目をBoth
に切り替えると両方のInput
が使えるようです
過去のコードを流用しないといけない案件の場合は、Both
にしないとダメですね。