[unity] new input system / ゲームパッドとキーボードの共用(仮公開)

本記事の最終版はzennに記載します。


今のところunity標準であるInput Managerは少々設計が古く、これはすでにリリースされている new input system にリプレースされていくと思います。
特に、コントローラの割当定義のときにゲームパッドなどを実際につなぎ、ボタンを押すと簡単に割りあてできるところが便利です。

今回は、キャラクタ移動とカメラ移動をこの新しいinput systemで作ってみます。

1. new input systemのセットアップ

新しいInput Systemをインストールするには、Unityのパッケージマネージャ(menu: Window > Package Manager)を開き、リストからInput Systemパッケージを選択し、「install」をクリックします。

Unity Registry → 検索🔍input が早いかも

デフォルトでは、Unityの古典的な入力マネージャ(UnityEngine.Input)がアクティブになっており、新しい入力システムのサポートは非アクティブになっています。
Input Systemパッケージをインストールすると、Unityは新しいバックエンドを有効にするかどうかを尋ねてきます。Yesをクリックすると、Unityエディタを再起動します。新しいバックエンドが有効になり、古いバックエンドを無効になります。

2. keyバインドの設定

InputActionを複数まとめたinputActionsを作り、多くのコントローラーで使い回します。

1) Projectの任意の場所(ここではAssets直下)で、右クリック → Create → Input Action にて.inputactionsファイルを作成します。

画像1

名前を任意に変更します。ここでは「StandardKeyBind」に変更しました。

画像2

このキーバインドをこれから設定していきます。
しっかりと設定しておけば、後々別のunity projectでも流用できます。自分の開発環境にあった設定を作り込んでみるのがよいと思います。

2) 続いて、このStandardKeyBindを設定していきます。

StandardKeyBindをダブルクリックすると、.inputactions ファイルのエディタウィンドウが表示されます。

画像3

Action Maps、Actions、Properties の3ペイン構成です。

Action Mapsの右の「+」をクリックし、新規マップを追加します。

画像8

そして新しく追加したAction Mapをダブルクリックし、Action Map名を変更します。ここでは Player と変更しました。

画像5

次に、New action をダブルクリックし、アクション名を変更します。ここでは Move に変更しました。

画像7

Moveの左の△をクリックし、Moveにアサインされているバインドを展開します。

画像8

このMoveには以下の3つをバインドします。
(a) コントロールパッドの左スティック
(b) キーボードの WASDキー
(c) キーボードのカーソルキー

まずは、(a)コントロールパッドの左スティックをバインドします。
Moveをクリックし、PropertiesのActionにある Action Typeを Valueに、Control Typeを Vector2に変更します。

画像9

続いてMoveの下にある、<No Binding>を設定します。

画像8

Path → Game Pad → Left Stick を選択し、バインドします。

画像10

Move に Left Stick [Gamepad]がバインドされました。

続いて、(b)WASDキーをアサインします。Moveの右の[+.]をクリックし、Add 2D Vector Compositeでバインド枠を追加し、名前をWASDに変更します。

画像11

画像12

続いて、Upをクリックし、Pathの右をクリックします。

画像13

キーアサインウィンドウが表示されるので、Listenをクリックし、Wキーを押下します。押したキーが表示されるので、それをクリックします。

画像15

画像15

WASD - Up に Wキーがアサインされた。

画像16

同様に、Down、Left、Rightもアサインします(いきなりすっとばし
無事アサインできると、下のようになります。

画像17

続いて、(c)カーソルキーもアサインしていきます。
Moveの右の[+.]をクリックし、Add 2D Vector Compositeでバインド枠を追加し、名前をCURSORに変更します。カーソルキーもアサインすると、以下のようになります。

画像18

Moveはこれでおわりです。続いて、各ボタンをアサインします。
ボタンのアサインは、私は以下のようにしましたが、ゲームのコンセプトにあわせお好みでアサインしてみてください。
(a) XBOXコントローラのY = Tabキー
(b) XBOXコントローラのB = Eキー
(c) XBOXコントローラのX = Qキー
(d) XBOXコントローラのA = SPACEキー

Action[+] → ButtonY に名称変更、 Action Typeを Buttonにします。

画像22

バインディングは Path → Listen を押下し、アサインしたいコントローラのボタンを押すとリストに出てくるのでそれを選びます。

画像22

画像23

ゲームパッドのButton Northがアサインされました。

同様に4つのボタンすべてをアサイン

画像24

最後に、カメラビューの変更をアサインします。

Action[+] → Camera に名称変更、 Action Typeを Value に、Control TypeをVector2に変更します。

画像24

Bindingは、Path → Game Pad → Right Stick を選択します。
右スティックでカメラをぐりぐりするためです。

画像20

画像25

<ここにマウスの定義を追記する>

.inputactions ファイルのエディタウィンドウを閉じると、Saveするか確認されます。間違わずSaveしておきましょう。

もしかして使いみちがあるかもしれないので、inputactuinsファイルをダウンロードできるようにしておきます。

3. 基本的な使い方

1) input systemを使うGameObjectに、Add Compornet → Input → Player Inputで入力コンポーネントを追加します。

2) Actions に先に作成した Input Actions を設定し、Default MapにPlayerを指定します。

画像26

3) スクリプトに以下を追加します。
先に設定した Player にキーバインドされた Move と ButtonA を利用するサンプルです。

・先頭ブロック

using UnityEngine.InputSystem;

・MonoBehaviourのprivate定義領域

 InputAction move;
 
 void Start()
 {
   // ...
   move = playerInput.actions["Move"]; // ← "Move" Actionを利用する。
   move = playerInput.actions["ButtonA"]; // ← "ButtonA" Actionを利用する。
 } 

・Update()内

 void Update()
 {
     // キー入力を取得
     var inputMoveAxis = move.ReadValue<Vector2>(); // "Move" Action は Vector2型
     
     inputDirection.z = inputMoveAxis.x;
     inputDirection.x = inputMoveAxis.y;
     // inputDirection.z = Input.GetAxis("Horizontal"); // 旧システム
     // inputDirection.x = Input.GetAxis("Vertical"); // 旧システム
     
     if (fire.ReadValue<float>() >0f ) // "ButtonA" Action は float型
     {
         // fire!
         Debug.Log("Fire");
     }
 }

4. キャラクタコントローラー

以前作成したキャラクタコントローラを new input systemに変更したものをダウンロードできるようにしておきます。

5. カメラコントローラー

(作成中)




いいなと思ったら応援しよう!