以前に簡単に作った全方位STGのデモがあったので、入力の実装をInputSystemへ移行してみました。
主にキーボードからの入力と、マウスの入力の取得について変更をしたので、その報告です。
環境
Unity 2020.3.22f1
Input System 1.0.2
Input Actionを作成
Quick start guide | Input System | 1.3.0
まずは上記リンク先を参考にInput Actionsを作成、Player Inputをプレイヤーのゲームオブジェクトにアタッチします。
今回は、InputActions自体は触らないので、そのまま作成したものをActionsに設定します。
キーボードからWASD入力を受け取る
作成時からInputActionsに作られているMoveを読み込んで使います。
色々と省略していますが、以下のようなコードで実装しました。
using UnityEngine.InputSystem; /////中略////// PlayerInput playerInput; void Start() { playerInput = GetComponent<PlayerInput>(); } void Update() { /////中略////// var inputVector = playerInput.actions["Move"].ReadValue<Vector2>(); moveVector = new Vector3(inputVector.x, inputVector.y, 0); }
以前はInputKeyDownとIf文で入力されているキーに応じて移動用のベクトルを生成していました。
今回、InputSystemを用いた実装ではReadValueで直接二次元のベクトルを取得するようにしました。
マウスの座標とクリックを取得
マウスの座標の取得
スクリーン上のマウスの位置は Mouse.current.position.ReadValue() で取得できます。
下のプログラムはマウスの位置に移動させるプログラムで、照準用カーソルの表示に使ってます。
// void Update() { //UnityEngine.Inputでの実装 //var mouseWorldPos = Camera.main.ScreenToWorldPoint(Input.mousePosition); //InputSystemでの実装 var mouseposition = new Vector3(Mouse.current.position.ReadValue().x,Mouse.current.position.ReadValue().y,0); var mouseWorldPos = Camera.main.ScreenToWorldPoint(mouseposition); //マウスのワールド座標での位置へ移動 transform.position = new Vector3(mouseWorldPos.x,mouseWorldPos.y,0); }
マウスクリックの取得
左クリックで弾を発射するようにしていたので、左クリックの入力を書き換えます。
左クリックの入力は Mouse.current.leftButton.wasPressedThisFrame で取得できます。
void Update() { //UnityEngine.Inputでの実装 // if(Input.GetMouseButtonDown(0)){ // InstanceBullet(); // } //InputSystemでの実装 if (Mouse.current.leftButton.wasPressedThisFrame) { InstanceBullet(); } }
おわりに
InputSystemについて詳しい説明をするというよりは、書き換える場合どんな感じかという紹介的な記事でした。
今後InputSystemを採用しているアセットとかも増えそうなので、仲良くしていけたら良いなと思ってます。
参考
Input System | Input System | 1.3.0
Migrating from the old input system | Input System | 1.3.0
↑UnityEngine.Inputで実装していたことを同じように実装するにはどうしたらいいかが色々書かれています