(:3[kanのメモ帳]

個人ゲーム開発者kan.kikuchiのメモ的技術ブログ。月木更新でUnity関連がメイン。

(:3[kanのメモ帳]


本ブログの運営者kan.kikuchiが個人で開発したゲームです!

    

複数のプラットフォームやコントローラーに対応できるInput Systemの導入と設定、使い方【Unity】【Input System】


このエントリーをはてなブックマークに追加


この記事でのバージョン
Unity 2022.3.21f1
Input System 1.7.0

はじめに

UnityはUnityEngine.Inputクラスを使う事で、コントローラーへの対応が比較的簡単に行えます。



しかし、様々なコントローラーに対応しようとすると途端に面倒になります。

例えばデフォルトの状態だと、Xboxコントローラーのスタートボタンと

PS4のR2 ボタンが同じ入力として扱われる、みたいな感じです。


という事で今回は、そんな複数のプラットフォームやコントローラーに対応したい時に使える

Unityの公式機能であるInput Systemの紹介です!


ちなみに、以下のようなアセットを使う事で簡単に対応する事も可能です。


InControl | Input Management | Unity Asset Store


一応、個人的なInput Systemとアセットの違いを言うと、出来る事の違いはそんなに無さそうですが、

Input Systemは公式機能なので安心感がありますし、無料で使えて情報も多いです。

ただ、その代わりにちょっと設定が面倒かなという印象です。


Input Systemとは

そもそもInput Systemとはなんぞやという話からですが、

ざっくりいうと、色々なプラットフォームやコントローラーの

インプット(入力)を良い感じに処理してくれる仕組みです。

(なので「スマホアプリ限定でタッチだけで操作」みたいな場合だと恩恵はあんまりないかも)

コードロジックにアクションをバインドするだけで、その後「Input Action」ウィンドウ内に異なるデバイスとコントロールを視覚的に有効にできます。


ちなみに最初に出てきた、古い方がUnityEngine.Input(InputManagerとも呼ばれる)で、

今回紹介する新しい方がUnityEngine.InputSystemです。併用もする事も可能です。


導入

Input Systemはデフォルトでは有効になっていないので、

お馴染みのPackageManagerを使って導入を行います。

と言っても、上部メニューのWindow/Package Managerからウィンドウを開き、


Packages:Unity RegistryInput Systemを探し、Installボタンを押すだけ。


なお、Samplesから使い方の参考になるサンプルをインポートする事も出来ます。


Input Systemをインストールすると以下のようなウィンドウが表示されるので、Yesをクリックします。

こうする事でInput Systemを有効にしてUnityを再起動します。

このプロジェクトは新しい入力システムパッケージを使用していますが、新しい入力システム用のネイティブプラットフォームのバックエンドが、プレーヤーの設定で有効になっていません。これは、ネイティブ デバイスからの入力が通らないことを意味します。

バックエンドを有効にしますか?そうすることで、エディターが*再起動*します。

DeepL翻訳

This project is using the new input system package but the native platform backends for the new input system are not enabled in the player settings. This means that no input from native devices will come through.

Do you want to enable the backends? Doing so will *RESTART* the editor.


ちなみにEdit/Project Settings


PlayerにあるActive Input Handlingからどの入力を有効にするかを選べます。


なお、プログラムで有効になっている入力を判定する場合は以下のような感じに。

#if ENABLE_INPUT_SYSTEM
/*InputSystem(新しい方)が有効な場合の処理*/
#endif

#if ENABLE_LEGACY_INPUT_MANAGER
/*InputManager(古い方)が有効な場合の処理*/
#endif



設定

導入が終わったら、次はInput Systemの設定です。

Assets/Create/Input Actionsからアクションアセットを作成し、


作成したアセットのEdit assetを押します。(ダブルクリックでもOK)


そこで「Player」や「UI」といった操作対象ごとのAction Mapを作成します。


さらに各Action Mapの中に「Move」といった操作内容ごとのActionを作成します。


最後に各Actionに「Left Stick」といった具体的な操作方法ごとのBindeingを作成します。


ちなみに自分の環境だとBindingを選ぶ時にGamepad等をクリックしても反応がなく、

キーボードの矢印キーで操作しました。(検索欄も潰れて隠れているが一応使える)


この初期設定が結構面倒なので、とりあえず動かしてみたいという時は

Player Inputというコンポーネントをてきとうなオブジェクトに追加し、Create Actions…を押す事で、


自動である程度の設定をする事が出来ます。



使い方

最後に使い方です。アクションアセットのGenerate C# Classにチェックを入れ、

Applyを押すことでC#のクラスが自動生成されるので、


その生成されたクラスを使って、以下のような感じで入力を処理するイメージです。

using UnityEngine;
using UnityEngine.InputSystem;//InputAction等を使うのに必要

public class InputSample : MonoBehaviour {
    
  //=================================================================================
  //初期化
  //=================================================================================
    
  private void Start() {
    //自動生成したNewControlsをインスタンス化し、有効化
    var _controls = new NewControls();
    _controls.Enable();
        
    //Moveの各イベント登録
    _controls.Player.Move.started   += OnMove;
    _controls.Player.Move.performed += OnMove;
    _controls.Player.Move.canceled  += OnMove;
  }

  //=================================================================================
  //Move
  //=================================================================================
    
  //Moveが実行された
  private void OnMove(InputAction.CallbackContext context) {
    var value = context.ReadValue<Vector2>();

    if (context.started) {
      Debug.Log($"Move 開始 : {value.x}, {value.y}");
    }
    if (context.performed) {
      Debug.Log($"Move 実行中 : {value.x}, {value.y}");
    }
    if (context.canceled) {
      Debug.Log($"Move キャンセル : {value.x}, {value.y}");
    }
  }

}


ちなみにアクションアセットの設定を変更してSaveすると、

この自動生成したクラスの内容も自動で更新されます。



参考