【Unity】PlayerInputでInputSystemからの入力操作を受け取れる!

PlayerInputの使い方 Unity

こんにちは、ともくんのゲーム作り部屋にようこそ!

このページでは、

「PlayerInputってなに?」

「PlayerInputはどうやって使えばいいの?」

というお悩みの方に向けた内容となっています。

Unityでは、InputSystemを使うことで、InputActionsで設定したアクション毎に入力操作が管理されて、スクリプト側でそのアクション単位で入力情報を受け取ることができます。

ただ、スクリプト側で入力情報を受け取って処理を作るためには、事前にInputActionsのインスタンスを生成したり、アクション毎のコールバック処理などの記述が必要となってきます。

InputSystemで提供されているPlayerInputコンポーネントは、このような複雑な処理を記述せずに入力操作による処理を作ることができます。

そこで、このページでは、UnityのInputSystemで使われるPlayerInputというコンポーネントについて、どんな機能や仕組みなのか、また基本的な使い方までをまとめていきます。

開発環境
  • Windows11
  • Unity 6.3 LTS(6000.3.2f1)
この記事を書いた人

ゲーム作りを学び始めた一児のパパです。
このブログは、子供から「ゲームを作ってみたい!」と言われ、非プログラマーでゲーム作りをしたことない僕が、ゲーム作りの本を読んで独学でゲーム開発を学んでいるブログです。
同じように初めてゲーム作りをしている方と一緒に学んでいけるようなブログに出来たらいいなと思っています。
また、「このコードはおかしい」とか「もっと良い書き方があるよ!」などあれば、どんどん指摘して頂けると助かります。

PlayerInputとは?

まずは、PlayerInputがどのような機能なのか紹介していきます。

InputActionsの入力操作をスクリプトに渡す機能

PlayerInputとは、InputSystemで提供されている機能で、InputActionsで設定した入力操作の情報をスクリプトに渡すという処理を行います。

そもそもInputSystemというのは、Unityでキーボード・マウス・コントローラーなど複数のデバイスからの入力操作を管理しているシステムとなっています。

そしてこのInputSystemは、InputActionsというアセットを使って、プレイヤーやUIのアクション毎における入力操作を設定することができ、スクリプト側ではその入力情報を受け取ることで、操作に合わせた処理を作ることができます。

PlayerInputは、この入力操作を行うInputActionsと入力処理を行うスクリプトの間を繋いでいるもので、より効率的に入力操作の処理を行えるようにしているコンポーネントです。

複雑な入力処理をスクリプトで記述する必要が無くなる

PlayerInputを使うメリットとして、スクリプト側で複雑な処理を記述する必要がなくなり、簡単にInputActionsによる入力処理を作れるようになります。

通常、InputActionsで入力処理を作る場合は、設定した後にInputActionsのC#クラスを生成して、スクリプト側でそのInputActionsクラスをインスタンス化します。

そして、Actionのイベント毎にメソッドを登録するコールバック処理などを記述して、入力操作の処理を作っていきます。

ただ、InputActionsのAction数が多ければ多いほど、コールバックを登録する記述が増えてしまい複雑化していきます。

そこで、PlayerInputを使うことで、紐づけたInputActionsの入力情報をスクリプトに送信してくれるので、スクリプト側ではInputActionsのイベントを受け取るための記述が必要なく、Action毎に処理を行うメソッドを記述するだけで操作処理を作れるようになります。

このように、PlayerInputコンポーネントを使うことで、より手軽にInputActionsによる入力処理を作ることができます。

PlayerInputの基本的な使い方

ここからは、実際にPlayerInputの基本的な使い方について紹介していきます。

なお、ここではInputActionsのアセットとして、以下のように「Player」のActionMap名で、キャラクターを移動させる「Move」と、ジャンプさせる「Jump」のアクションイベントをキーボードとコントローラーで設定して、「TestInputActions」という名前で保存しています。

PlayerInputコンポーネントを紐づける

まずは、InputActionsの入力操作で処理を行いたいオブジェクトにPlayerInputコンポーネントを紐づけます。

今回は、以下の赤色の2DオブジェクトにPlayerInputを付けていきます。

オブジェクトを選択した状態で、インスペクターウィンドウの「AddComponent」をクリックして、

「Input」の中にある「PlayerInput」を選択します。

PlayerInputの設定を行う

次に、インスペクターウィンドウからPlayerInputの設定を行っていきます。

Actions:InputActionsのアセットを紐づける

Actionsの項目に、設定するInputActionsのアセットを紐づけておきます。

ここで指定したInputActionsの入力イベントの情報が、スクリプト側で受け取れるようになります。

デフォルトで準備されているInputActionsのアセットが指定されているので、ここでは「TestInputActions」に変更しておきます。

また、InputActionsに「Control Scheme」を設定している場合、以下の3つの項目が表示されます。

  • Default Scheme:デフォルトで使用するスキーム。「Any」で複数の操作を切り替えられる。
  • Auto-Switch:操作方法を自動で切り替えるかどうか。
  • Default Map:デフォルトで使用するActionMapを選択。

ここでは、以下のように設定しています。

なお、「UI Input Module」はUIで使用する場合、また「Camera」は複数の画面で操作を行う場合に使用するので、今回は設定を行いません。

Behavior:入力情報を送信する方法を選択する

Behaviorは、InputActionsで設定した入力操作が行われた際に、スクリプトに送信する方法を選択できる項目で、以下の4つから選択することができます。

  • Send Messages:SendMessageメソッドで送信
  • Broadcast Messages:BroadcastMessageメソッドで送信
  • Invoke Unity Events:UnityEventを使って送信
  • Invoke C Sharp Events:C#イベントを使って送信

ここではデフォルトの「Send Messages」を選択しています。

スクリプトから入力情報を受け取り処理を作る

PlayerInputの設定が終わったら、スクリプト側で入力操作が行われた際の処理を作っていきます。

以下のスクリプトをオブジェクトに紐づけておきます。

using UnityEngine;
using UnityEngine.InputSystem;  // スクリプトでInputSystemを利用する記述

public class PlayerController : MonoBehaviour
{
    Rigidbody2D rb;
    float moveValue;
    float speed = 7.5f;
    float maxSpeed = 5.0f;

    void Start()
    {
        rb = GetComponent<Rigidbody2D>();
    }

    void FixedUpdate()
    {
        if (moveValue != 0 && Mathf.Abs(rb.linearVelocityX) < maxSpeed)
        {
            rb.AddForce(transform.right * moveValue * speed);   // 入力値によって移動する処理
        }
    }

    // Moveのアクション操作が行われた場合の処理
    void OnMove(InputValue value)
    {
        moveValue = value.Get<float>(); // 入力値を取得している
    }

    // Jumpのアクション操作が行われた場合の処理
    void OnJump()
    {
        if (rb.linearVelocityY == 0)
        {
            rb.AddForce(transform.up * 400f);   // ジャンプする処理
        }
    }
}

まず、2行目でスクリプト内でInputSystemを使いたいので、以下のように記述しておきます。

using UnityEngine.InputSystem;  // スクリプトでInputSystemを利用する記述

次に、PlayerInputから送信された入力情報で処理を行うためのメソッドを作っていきます。

今回、「Send Messages」を選択しているので、「On+Action名」のメソッドを定義してあげることで、入力イベントの操作が行われた際に自動的にそのメソッドの処理が実行されるようになります。

例えば、「Move」のアクションであれば、25行目で「OnMove」というメソッドを定義していて、引数をInputValue型にすることで入力値の情報を受け取っています。

そして、Getメソッドを使って、移動の入力値をfloat型の変数を使って更新する処理を行っています。

void OnMove(InputValue value)
{
    moveValue = value.Get<float>(); // 入力値を取得している
}

なお、実際の移動処理は、取得した値を使ってFixedUpdate内の20行目でオブジェクトを移動させています。

また、「Jump」のアクションであれば、31行目で「OnJump」というメソッドを定義していて、その中で上向きに力を加えてジャンプする処理を行っています。

void OnJump()
{
    if (rb.linearVelocityY == 0)
    {
        rb.AddForce(transform.up * 400f);   // ジャンプする処理
    }
}

これでゲームを実行してみると、

上記のように、入力操作に応じて処理が行われるようになりました。

もし、他にInputActionsにアクションを追加している場合も同様に、それぞれの入力操作に応じて「On+Action名」のメソッドを作ってあげるだけで、簡単に処理を行うことができるようになります。

まとめ

このページでは、UnityのInputSystemで使えるPlayerInputというコンポーネントについて、どんな機能なのか、また使い方までをまとめていきましたが、いかがでしたでしょうか?

PlayerInputは、InputActionsで設定した入力操作の情報をスクリプトに送信するという機能を持っています。

このPlayerInputを使うことで、スクリプト側でInputActionsの複雑な設定を行わなくても、入力操作による処理を作ることができるようになります。

特に、設定しているアクション操作の数が多いほど、スクリプトに記述する内容が増えてしまうため、PlayerInputが非常に便利に使えます。

最後までお読みいただきまして、ありがとうございました!

コメント