本記事ではInput Systemを使ってキーボードとコントローラを同時に対応する方法を紹介します。
Input Systemを使ったコントローラサポート
キーボードのみよりコントローラに対応したほうがゲームの離脱を低減できます。
私も恥ずかしながらキーマウのみのゲームは離脱しがちです・・・。
Unity1weekでもコントローラ対応だと操作性の評価が上がるようですね。
Unityではコントローラを使う方法がいくつかあります。
ここのところUnityはnew Input Systemとやらを推奨しているようです。
本記事では新しいInput Systemを使ったコントローラ対応とキーボードの併用を紹介します。
Input System をセットアップする
Input Systemは入力を下位で抽象化し我々の実装を楽にしてくれる仕組みです。ほかにもいくつかご利益はありますがここでは割愛します。まずはこのInput Systemをインストールします。
Unityを開き、Window→ Package Managerを開きUnity Registryの中からInput Systemをインストールします。

(参考)インストールできると、Packagesの下にInput Systemのフォルダができます。

次に、AssetsのどこかにInput Actionsを作成します。


これは、キーボード入力やゲームパッド入力を抽象化しアクションに変換するための設定ファイルです。
Input Actionの設定
さきほど作ったInput Actionを開きます。専用の設定ウィンドウが開きます。

まずは、一番左のAction Mapsを+しましょう。すると、1つのMapとActionが自動でできます。
とりあえずAction MapをPlayerにし、Actionsも+してMoveを作ってみましょう。

Actionsはゲーム内での動作にあたり、「攻撃」、「移動」、などのアクションです。ここにコントローラやキーボードを割り当てていきます。
今回は移動のMoveにGamepadの左スティックとキーボードのWASDを割り当てます。
Moveのアクションを選択しAction PropertiesのAction TypeをValueのVector2にします。

Moveの下のBindingにGamepadのLeft Stickを割り当てます。

次はキーボードのWASDを割り当てるために上下左右割り当てを追加します。
Moveの+のところからUP/Down/Left/Right Compositeを追加します。

出てきた上下左右に、さきほどと同じようにキーボードのAWSDを割り当てます。

これでInput Actionsの設定は終わりです。
Player Input をプレイヤーにアタッチする
ここまでで、コントローラとキーボードをアクション「Move」という単位に抽象化できました。
次はアクションとプレイヤーを紐づけていきます。
- キャラにPlayer Inputをアタッチ
- アクションコントローラをPlayer Inputにセット
- Playerを動かすスクリプトを作る
- スクリプトをPlayer InputのEventsに取り付ける
●キャラにPlayer Inputをアタッチ
適当な3Dオブジェクトに、Player Inputコンポーネントをアタッチします。

●アクションコントローラをPlayer Inputにセット
Actionsのとろこに、先ほど作ったActionコントローラをD&Dします。

Player InputのBehaviorをInvoke Unity Eventsにします。

(Send Messageのほうが簡単ですが、例えばActiveでないオブジェクトにはメッセージが届かなかったり、あまり推奨はされていないようです)
●Playerを動かすスクリプトを作る
Playerを動かすスクリプトを作ります。名前はなんでもいいですが、Player Moveとしました。

スクリプトで必要なのは、Moveのアクションが発生したときに呼ばれるOnMoveイベントと、Updateでの移動の部分です。
PlayerMove.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;
public class PlayerMove : MonoBehaviour
{
[SerializeField] private float speed = 10;
// 変化した入力を保持
private Vector2 move_amount;
// 入力が変化したときに呼ばれる(Player InputコンポーネントのEventsにセットする)
public void OnMove(InputAction.CallbackContext context)
{
move_amount = context.ReadValue<Vector2>();
}
private void FixedUpdate()
{
if (move_amount.magnitude >= 0.1f)
{
gameObject.transform.Translate(new Vector3(move_amount.x, 0f, move_amount.y) * speed * Time.deltaTime);
}
}
}
●スクリプトをPlayer InputのEventsに取り付ける
スクリプトができたら、それをPlayer Inputのコールバックに設定します。
※コールバックとはイベント発生時に呼ばれるメソッドのことです
EventsのところにあるPlayerを開き、MoveのところにさきほどのスクリプトのOnMoveを設定します。

なお、EventsにあるPlayerはInput Actionファイルに設定したAction Map名で、Moveはアクション名です。
動作確認
ここまでで設定は終わりです。ビルドして動かしてみましょう。
WASDとコントローラでキャラが動かせたら成功です。
まとめ
new Input System でキーボードとコントローラを同時にサポートする方法を紹介しました。
手順にすると以下のような感じです。
- Package ManagerからInput Systemをインストール
- Input Actionを設定する(入力の抽象化)
- Player Inputをキャラにアタッチ
- キャラを動かすスクリプトを作る
- Player Inputにスクリプトを取り付ける
ほかにもいろいろできそうですが、それはまたの機会にいたします。
かわいい我が子にオリジナルアプリを!
コメント