いんでぃーづ

ゲームいろいろ、いろいろ自由

Unity : 新 Input System はじめの一歩

ユーザの入力を検出するには Input クラスを使ってするのがイニシエからの手順でしたが、新方式の InputSystem が4月に正式リリースとして Package Manager に登録されていました。

f:id:sugar_affordance:20200908082907p:plain

自分はテレビで前作を取り上げてもらってから色々あってずっとゲーム作ってなかったのですが、というか主に ペルソナ5ロイヤルをずっとやっていた のですが、そろそろ次のゲーム作りたいなあとふと思ったので新システムにキャッチアップしていこうと思います。

・検証環境 Unity 2019.4 LTS

インストール方法

デフォルトでは新Systemは有効になっていないので、Package Manger からインストールしましょう。

メニューから Window > Package Manager をクリック。

f:id:sugar_affordance:20200908082922p:plain

Package Manager のウインドウが出たら、右上の検索窓で "input" と入れるとすぐ見つかります。

f:id:sugar_affordance:20200908091623p:plain

窓右下の Install ボタンでインストールします。

"新 Input System が有効になってないよ。有効にしてUnityを再起動するよ?"

という旨のダイアログが出てきますので、

f:id:sugar_affordance:20200908083611p:plain

秒でYesをクリックします。ぴえん。

シーンに操作キャラを配置

プレイヤーの入力を受け取るオブジェクトとして、いつもお世話になっているスキンヘッドのサラリーマンを配置しました。

f:id:sugar_affordance:20200908094854p:plain

Input Systemでの入力

新 Input System の概念ですが、従来のように "十字キーの上" "Aボタン" などの入力でなく、
"ジャンプ" "攻撃" などの アクション という入力をスクリプトで受け取るというかたちになります。

Steam用の入力ライブラリの Steam Input と同じ方向性ですね。

✳︎参考過去記事

indie-du.com

配置したプレイヤーオブジェクトに、自前のスクリプトPlayer Input コンポーネントをアタッチします。

f:id:sugar_affordance:20200908103102p:plain

自前のスクリプト内では、アクションに対応する操作を自分でプログラムします。
Player Input はアクションを自前スクリプトに配信するためのコンポーネントです。

アクションを作成する

ではスクリプトでアクションを受け取るために、専用のアセットを作成します。

Plyaer Input 内の Create Actions ボタンを押すと、.inputactions という拡張子のファイル保存ダイアログが出るので、適当なところにファイルを保存します。

f:id:sugar_affordance:20200908095808p:plain

保存したアセットは Player Input の Actions にリンクします。

表示が変わりました。今回はキーボード入力を受け取るために Default SchemeKeyBoard&Mouse に設定しました。

f:id:sugar_affordance:20200908100027p:plain

ここでさっき保存した .inputactions ファイルをインスペクタで見ると、すでにアクションがいくつか登録されていると思います。

f:id:sugar_affordance:20200908100436p:plain

キーボード用の 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 関数を呼び出せます。

f:id:sugar_affordance:20200908101640p:plain

動かしてみる

これで動くようになったので、エディタで実行してみましょう。

f:id:sugar_affordance:20200908102047g:plain

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

・次に読む

indie-du.com


“Unity” and Unity logos are trademarks or registered trademarks of Unity Technologies or its affiliates in the U.S. and elsewhere, and are used under license.


免責事項

当サイトの広告バナー、リンクによって提供される情報、サービス内容について、当サイトは一切の責任を負いません。

また、当サイトの情報を元にユーザ様が不利益を被った場合にも、当サイトは一切の責任を負いません。

すべて自己責任でお願いします。