Unity

【開発初期に対応したい】InputSystemの導入方法【ゲームのコントローラーで操作性向上】

本記事内には、アフィリエイトリンクを含む場合があります

通常Unityなどを使ってパソコンでゲームを作ると、
ついついキーボードやマウスによる操作を想定したゲームを作ってしまいます。

しかし、最近では、ゲーム好きな人は、
ゲームコントローラー(PS4やSwitchのコントローラーなど)を愛用しており、
それをパソコンにつないで遊ぶのが主流となっています。

ゲームコントローラーは
プロが長年開発し、設計された
完璧な操作感と快適さを兼ね備えているからです。
(FPSはマウスで照準を合わせたいって声もあるけど^^;)

つまり

できるだけ多くのユーザーに遊んでもらいならば、
マウスとキーボードの入力だけでなく、ゲームコントローラーにも対応した
ゲームを設計することが望ましいです。

ただし、そのためにはスクリプトに多くの追記修正が必要になってきます。

そこで活用したいのが、Unityで用意されている(新)Input Systemです。

今後ゲーム開発を行うならば
このInput Systemを当然の如く、利用する習慣をつけておくことをオススメします。
(後から対応は面倒なので、はじめから利用して作っていくべし)

それでは、本記事では、その導入方法を紹介しますが、
その例として、Unity初学者向けの記事で作成したゲームに
Input Systemを適用していきます。

はじめからトレースしたい方は、こちらをご参照ください(簡単です)。

*実は、旧InputSystemでもスティックの入力を検知して動きますが、
コントローラーのその他のボタンの割り当てなどを含めると、どっちみち導入しとくべきです。

1.新Input Systemの導入と設定

まずPackage Managerを開き、カテゴリーをUnity Registryとして、Input Systemを選択します。

Installすると、Warningが出ます。
現在のInput Systemから新たなInut Systemに変えてよいかという質問があります。

「Yes」をクリックします。

もしすでにある程度ゲームを開発していて、新たなInput Systemに置き換えて不具合が出た場合は、
EditタブのProject Settingから、Player_Other Settings_Configuration _Active Input Handlingを設定し直すのが良いでしょう。
(旧式と新式を利用するBothを試してみるのが良いかと)

インストールしたら、Assetsフォルダ内にInputというフォルダを作成します。

 

そのフォルダの中に、右クリックからInput Actionsを選んで作成します。

PlayerAsset(任意)と名付けたら、そのファイルをダブルクリック。
Input Actionsというタブウィンドウが独立して現れるので、Projetタブと同じところにはめ込みましょう。

それでは、このInput Actionsのタブで作業していきます。

Action Mapsの「+」から、Playerと名付けたファイルを作成、
Actonsの「+」から、
まずは移動の入力キーを設定していくので、Moveと名付けてファイルを作成します。

このゲームプロジェクトのPlayerは、前後左右を(二次元入力で)移動するので、
Moveを選択したら、
ActionTypeを「Value」、Control Typeを「Vector2」に設定します。

なお、Input Actionsの設定した内容は保存しなければいけないので、
忘れちゃう人はAuto-Saveにチェックを入れておきましょう。

ここから移動を行うキーの設定です。

まずは、キーボードの入力を設定します。
Move右横の「+」からAdd Up\Down\Left\Right Compositeクリックし、2D Vector (WASD)という名前にします。

それのUpを選び、Binding PropertiesのPathをクリックして、「Listen」をクリック。
すると、入力されるキーを検出するようになります。

Wキーを押すとW[Keyboard]が出てくるので、クリックします。

これでVector2のUpが、Wキーの入力で可能になりました。

同じ要領で、Down(S)、Left(A)、Right(D)も設定していきますーーー

 

次に、ゲームコントローラーによる移動の入力を設定していきます。
ゲームコントローラーがある方はパソコンに接続してください。
(筆者はPS4コントローラーを接続して進めます)

Moveの「+」からAdd Bindingをクリック。
そのPathから「Listen」をクリックした上で、ゲームコントローラーの左スティックを動かします。
すると、Left Stick[GamePad]が出るので、選択すればOK。

ここでの移動(Move)に関する設定は以上です。

 

続いて、本ゲームはSpaceキーでジャンプできるようにしていました。

ゲームコントローラーでもジャンプできるように設定していきます。

Actionsの右横の「+」からNew Actionを作成し、Jumpと名付けます。
そのAction TypeはButtonとします。

まずは、現状通りSpaceキーを当てていきます。
Add Bindingで<No Binding>を作成し、そのPathの「Listen」をクリックした状態でSpaceキーを入力します。

出てきたSpace[Keyboard]を選択します。もう慣れましたね?^^

次はゲームコントローラーです。

Jumpの右横「+」から同じくAdd Bining、Pathの「Listen」をクリックして、
ゲームコントローラーのXボタン(任意)を押します。

するとButton South[GamePad]が出てくるので選択します。
(PS4コントローラーでは、Xボタンは下に位置するボタンなので、Southとなりました)

以上で、Input Actionsタブでの設定は完了です。

Inputフォルダに戻り、PlayerAssetファイルをクリックします。

InspectorがPlayerAssetのものになるので、「Generate C# Class」にチェックを入れて、Applyをクリックします。

すると、PlayerAssetのScriptが自動で作成されます。

これでInput Actionタブで設定した内容をもったクラスができたので、
すでに作ってあるPlayerを動かすスクリプト(PlayerController.cs)を編集して、
このInput Systemの機能を活用できるようにしていきます。

2.既存のスクリプト編集

PlayerControllerを以下のように、追記修正します。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem; //追記

public class PlayerController : MonoBehaviour
{
    PlayerAsset playerAsset; //追記
    InputAction move; //追記

    [SerializeField] float moveSpeed = 10f;
    [SerializeField] float jumpSpeed = 5f;
    Rigidbody rb;
    bool isGrounded;

    void Awake()
    {
        playerAsset = new PlayerAsset();
    }

    private void OnEnable() //追記
    {
        playerAsset.Player.Jump.started += Jump;
        move = playerAsset.Player.Move;
        playerAsset.Player.Enable();
    }

    private void OnDisable() //追記
    {
        playerAsset.Player.Jump.started -= Jump;
        playerAsset.Player.Disable();
    }
 
    // Start is called before the first frame update
    void Start()
    {
        rb = GetComponent<Rigidbody>();
    }
 
    // Update is called once per frame
    void Update()
    {
        //方向キーによる移動
        // float x = Input.GetAxis("Horizontal") * Time.deltaTime * moveSpeed;
        // float z = Input.GetAxis("Vertical") * Time.deltaTime * moveSpeed;
        float x = move.ReadValue<Vector2>().x * Time.deltaTime * moveSpeed; //追記
        float z = move.ReadValue<Vector2>().y * Time.deltaTime * moveSpeed; //追記
        transform.Translate(x,0,z);
 
        isGrounded = CheckGround();
        //スペースキーによるジャンプ           //以下コメントアウト
        // if (Input.GetKeyDown(KeyCode.Space))
        // {
        //     if(isGrounded)
        //     {
        //         isGrounded = false;
        //         rb.AddForce(Vector3.up * jumpSpeed, ForceMode.Impulse);
        //     }
        // }
    }
 
    //地面を検知する関数
    bool CheckGround()
    {
        var ray = new Ray(transform.position + Vector3.up * 0.01f, Vector3.down);
        var distance = 1.5f;
        return Physics.Raycast(ray, distance);
    }

    void Jump(InputAction.CallbackContext obj) //追記
    {
        if(isGrounded)
        {
            isGrounded = false;
            rb.AddForce(Vector3.up * jumpSpeed, ForceMode.Impulse);
        }
    }
}

OnEnable()はそのオブジェクトが表示されたとき、
OnDisable()は非表示されたときに、読まれる関数です。

ここではPlayerAssetクラスがもつ「Jump」や「Move」を、PlayerControllerクラスで扱えるように紐づけたり、解除したりしていると思ってください。

MoveというValueを返す場合は、move.ReadValue<Vector2>()といったように、
JumpというButtonによって関数を呼ぶ場合は、
void Jump(InputAction.CallbackContext obj){ }として
コーディングすれば、それぞれの機能するようになります。

 

それでは早速ゲームを実行してみて、
ゲームコントローラーで移動とジャンプができるか試してみてください。

キーボード入力よりも、家庭用ゲーム機を作っている感覚が味わえると思います。

 

という具合に、みなさんも
ゲーム開発の初期段階からInput systemを導入し、進めていくとよいでしょう~。

以上

ABOUT ME
いなも@システマライフハッカー
”仙豆”を開発することを夢見て、健康食品会社で働いていたものの、2016年に出会ったロシアの武術”システマ”こそ、その糸口があると感銘し、勝手にシステマ普及活動を始める。 一方で、クリエイティブなモノ作りが好きで、DX社会で楽しみを見出せる"Unity”を活かして、”スマートかつ快適な暮らし”のヒントを発信している。

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA