ユーザの入力を検出するには Input クラスを使ってするのがイニシエからの手順でしたが、新方式の InputSystem が4月に正式リリースとして Package Manager に登録されていました。
自分はテレビで前作を取り上げてもらってから色々あってずっとゲーム作ってなかったのですが、というか主に ペルソナ5ロイヤルをずっとやっていた のですが、そろそろ次のゲーム作りたいなあとふと思ったので新システムにキャッチアップしていこうと思います。
- インストール方法
- シーンに操作キャラを配置
- Input Systemでの入力
- アクションを作成する
- スクリプトを作成
- スクリプトの関数を呼び出す設定をする。
- 動かしてみる
- 旧Inputとの互換性について
・検証環境 Unity 2019.4 LTS
インストール方法
デフォルトでは新Systemは有効になっていないので、Package Manger からインストールしましょう。
メニューから Window > Package Manager をクリック。
Package Manager のウインドウが出たら、右上の検索窓で "input" と入れるとすぐ見つかります。
窓右下の Install ボタンでインストールします。
"新 Input System が有効になってないよ。有効にしてUnityを再起動するよ?"
という旨のダイアログが出てきますので、
秒でYesをクリックします。ぴえん。
シーンに操作キャラを配置
プレイヤーの入力を受け取るオブジェクトとして、いつもお世話になっているスキンヘッドのサラリーマンを配置しました。
Input Systemでの入力
新 Input System の概念ですが、従来のように "十字キーの上" "Aボタン" などの入力でなく、
"ジャンプ" "攻撃" などの アクション という入力をスクリプトで受け取るというかたちになります。
Steam用の入力ライブラリの Steam Input と同じ方向性ですね。
✳︎参考過去記事
配置したプレイヤーオブジェクトに、自前のスクリプトと Player Input コンポーネントをアタッチします。
自前のスクリプト内では、アクションに対応する操作を自分でプログラムします。
Player Input はアクションを自前スクリプトに配信するためのコンポーネントです。
アクションを作成する
ではスクリプトでアクションを受け取るために、専用のアセットを作成します。
Plyaer Input 内の Create Actions ボタンを押すと、.inputactions という拡張子のファイル保存ダイアログが出るので、適当なところにファイルを保存します。
保存したアセットは Player Input の Actions にリンクします。
表示が変わりました。今回はキーボード入力を受け取るために Default Scheme を KeyBoard&Mouse に設定しました。
ここでさっき保存した .inputactions ファイルをインスペクタで見ると、すでにアクションがいくつか登録されていると思います。
キーボード用の Move アクションがすでに登録されているので、今回はこの入力を受け取るスクリプトを書きます。
スクリプトを作成
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.InputSystem; public class MyPlayer : MonoBehaviour { public void Move(InputAction.CallbackContext context) { // 移動方向を受け取る var v = context.ReadValue<Vector2>(); transform.position = transform.position + new Vector3(v.x, 0, v.y); } }
Moveアクションを受け取ったら Transform を移動するという単純なスクリプトです。
先頭に using UnityEngine.InputSystem; を書かないとエラーが出ます。
スクリプトの関数を呼び出す設定をする。
Player Input に赤枠のような設定をすることで、キーボードを押したときに Move 関数を呼び出せます。
動かしてみる
これで動くようになったので、エディタで実行してみましょう。
Sキー、Wキーを押すごとに一歩ずつ動いています。
一定距離ずつ瞬間移動するスーパーサイヤ人みたいでかっこいいですね!?
旧Inputとの互換性について
新Input System でも、旧と同じようにキーごとの入力を受け取ることもできます。
旧InputクラスのAPIに対応する関数がここにリストされています。
Migrating from the old input system | Input System | 1.0.0
キーを押しっぱなしにすたときの動作とかも設定できるようなので、移動スクリプトではそれが必要になるでしょう。
まださわり始めたばかりなのでなんとも言えないのですが、すべてのキーをアクションという単位にラップするとそれはそれで不便な気もするので、キー単体の検出もやりながら制御していくことになるような気がしなくもないけどどうなんでしょう。
他にもいろいろ機能があるっぽいので、何回かに分けて新Input Systemの機能を掘り下げていこうと思います。(飽きなければ)
・参考
Input System | Input System | 1.0.0
・次に読む