【Unity】Input System(新・入力システム)の使い方

Input Systemの使い方 ゲーム制作メモ

Unityでキーボード・マウス・ゲームパッド等の入力を扱うやり方といえば、今までは

  1. Input Managerでボタン等を設定し、
  2. Inputクラスで入力を取得する

という方法が一般的でした。ただしこのやり方は単純で分かりやすい反面、例えば色々な入力デバイスに対応しようとするとかなり面倒なことになる等のデメリットがありました。

そんな中Unity2019で全く新しい入力システムである「Input System」が登場。より柔軟に入力を扱えるようになったのはご存じの方もいらっしゃると思います。

…ところがInput Systemは

  • パッと見ではどうやって使えばいいのか全然分からない
  • 執筆時点では(登場からしばらく経っているにもかかわらず)使い方などの情報が乏しい

という感じなので、私自身「あるのは知ってるけど全然使う気にならなかった」というのが正直なところでした。たぶんこの記事をご覧の皆さんもそんな感じなのではないでしょうか?

でも先日実際に使ってみたら画期的で便利な入力システムだったので、皆さんもっと使ってみたほうが良いのではないかと思いました。そこでここでは

  • Input Systemとは何か。Input Managerとどう違うのか?
  • どうやって使うのか?

といったことについて説明していきますね。

スポンサーリンク

「Input System」の特徴は?旧Input Managerとの違いは何か?

ではまず「Input Systemにはどういう特徴があるのか?」「Input Managerとの違いはどんな部分化」というところから説明しましょう。

Input SystemはInput Managerの後継ではありますが、根本的な仕組みが大きく異なるのでその特徴はかなり違います。新しいInput Systemの主な特徴を挙げると次のような感じになります。

  1. 入力を「アクション」という単位で扱う
  2. 色々なデバイスに柔軟に対応できる
  3. 入力を手軽に変更・カスタマイズすることができる

特徴1:入力を「アクション」という単位で扱う

まず一つ目の大きな特徴は入力を「アクション」という単位で管理できる点です。アクションとは色々な入力をひとまとめにしたもので、この仕組みにより入力を受け取る側(=スクリプト)では入力デバイスの差異を気にする必要がなくなります

例えば「Attack」というアクションを作って

  • キーボードのZキー
  • マウスの左クリックボタン
  • ゲームパッドのAボタン

を登録しておいたとしましょう。このとき「どのデバイスからどういう種類の入力があったか」はInput Systemが処理してくれるので、入力を受け取る側はデバイスの違いを気にすることなく「Attackというアクションの入力があったかどうか」を受け取ることができます。

余談:
ちなみにこういったアクションのグループである「Action Map」も定義できるので、例えばプレイヤー操作用のアクション群とUI操作用のアクション群を別に定義して必要に応じて切り換えるといったこともできます。便利。

特徴2:色々なデバイスに柔軟に対応できる

次に二つ目の特徴は色々なデバイスに柔軟に対応できる点です。

従来のInput Managerには入力デバイスの管理機能がなかったので、色々な入力デバイスに対応しようとすると非常に面倒でしたがInput Systemはこの弱点を克服しています。というのは例えばゲームパッドの左スティックの入力が欲しければ、メニューからそれを選んでアクションに割り当てるだけだからです。

さらにInput Systemには「Control Scheme」と呼ばれる機能があり、入力デバイスを認識してアクションごとの入力を切り替えることもできます(例:「ゲームパッド」というスキームがある場合、ゲームパッドが接続されたら入力をそのスキームに切り替えられる)。

正直この辺の機能はめちゃくちゃ便利なので、一度使えるようになったらもうInput Managerには戻れないと思います。

特徴3:入力を手軽に変更・カスタマイズすることができる

最後に三つ目の特徴は入力を手軽に変更・カスタマイズできる点です。

先ほど書いた通り、Input Systemでは入力をアクションとして扱えるので、例えば攻撃時に使用するボタンを変更したい場合も利用側のコードを変更せずに簡単に差し替えることができます。

またInput Systemには「Processor」という機能があり、入力されたデータを簡単に加工することもできます。デフォルトでは入力値を反転・スケーリング・正規化したりすることが可能です。

Input Systemの導入方法

ではInput Systemについて知って頂いたところで早速導入方法を説明していきます。手順は次の4ステップです。

  1. パッケージマネージャからInput Systemをインストールする
  2. Input System全体の設定ファイルを作る
  3. プレイヤー設定でInput Systemを使うように設定する
  4. 手順4:EventSystemがある場合はモジュールを変更する

手順1:パッケージマネージャからInput Systemをインストールする

まずはパッケージマネージャからInput Systemのパッケージをインストールします。

パッケージマネージャからInput Systemをインストール

手順2:Input System全体の設定ファイルを作る

次にProject Settingsウィンドウ(メニューバーの「編集」→「プロジェクト設定」)を開き、「Input System Package」の「Create settings asset」ボタンをクリックしてInput System全体の設定ファイルを作ります(下図)。

Input System全体の設定ファイルの作り方

手順3:プレイヤー設定でInput Systemを使うように設定する

そうしたらプレイヤー設定でInput Systemを使うように設定します。メニューバーの「編集」→「プロジェクト設定」からProject Settingsウィンドウを開き、「Player」→「その他の設定」と展開します。下の方に「使用中の入力処理」という欄があるので、そこで「入力システムパッケージ(新)」または「両方」を選んでください(下図)。

使用する入力システムの設定

※旧Input Managerと共存させたい場合は「両方」を選びます。
設定を変更するとUnityが再起動するので注意

手順4:EventSystemがある場合はモジュールを変更する

最後にUI用の「EventSystem」が既にプレハブやシーンにある場合はそのモジュールをInput Systemのものに置き換えます。Input Systemをインストールしてあると置換ボタンが表示されるのでそれを押せばOKです。

Input Systemの基本的な使い方

さて、前置きが非常に長くなってしまいましたがここからが本題です。Input Systemの基本的な使い方(=設定&利用方法)について説明していきますね。

  1. Input Actionsファイルを作って設定を行う
  2. 入力を取得するゲームオブジェクトにPlayer Inputコンポーネントをつける
  3. スクリプトから入力を取得する

手順1:Input Actionsファイルを作って設定を行う

まずは「Input Actions」と呼ばれる入力の設定ファイルを作ります。適当なフォルダで右クリック→「作成」→「Input Actions」から新しいInput Actionsファイルを作りましょう。

そうしたらそれをダブルクリックしてInput Actions編集ウィンドウを開き、次のような手順で設定作業を行います。

  1. Control Schemeを作る
  2. Action Mapsを作る
  3. Actionを作って入力を割り当てる

Control Schemeを作る

はじめに「Control Scheme」という入力のカテゴリのようなものを作ります。これは例えば

  • キーボード&マウス
  • ゲームパッド
  • タッチ入力

といった感じに作ればOKです。

作り方ですが、Control SchemeはInput Action編集ウィンドウ左上の「All Control Schemes」と書かれているメニューのところから新規作成・編集できます(下図)。

Control Schemeの新規作成方法

Action Mapsを作る

次に「Action Maps」と呼ばれるアクションのグループを作ります。こちらは

  • Player
  • UI

といった具合に必要なだけグループを作ればOKです。作り方は一番左の欄の「Action Maps」と書かれたところの「+」ボタンを押せば新規作成できます。

Actionを作って入力を割り当てる

それができたらアクションを一つ一つ作って入力を割り当てていきます。

例えばプレイヤーキャラクターの移動の入力を扱うために「Move」というアクションを作る場合、

  • Action Type:値
  • Control Type:Vector2

という感じにします。

アクションの追加方法

そうしたらそのアクションにキーやボタンを割り当てます(=バインドと呼びます)。今作った「Move」の右にある「+」ボタンをクリックして新しいバインドを作り、

  • Path(割り当てるキー等)
  • このバインドを扱うScheme

などを設定しましょう。例えばゲームパッドの左スティックを移動の入力に使うなら下のような感じになります。

入力の割り当て(バインド)の例

あとはこの作業を必要なだけ繰り返せばOKです。

手順2:入力を取得するゲームオブジェクトにPlayer Inputコンポーネントをつける

次にプレイヤーなど入力を取得したいゲームオブジェクトに「Player Input」コンポーネントをアタッチして、「Actions」欄に手順1で作成したInput Actionsを設定します。

Player Input コンポーネント

手順3:スクリプトから入力を取得する

最後にC#スクリプトから入力を取得すればOKです。

input = playerInput.currentActionMap["Move"].ReadValue<Vector2>();

旧Input Managerからの乗り換え方法

ところでInput Systemを使い始めると「Input ManagerでやってたことをInput Systemで置き換えたいけどよく分からん!」という場合もよくあると思います。そのような場合は下記ページ(Input System公式マニュアル)を参考にすると良いでしょう。

Migrating from the old input system | Input System | 1.0.0

おわりに

以上、Input Systemの概要や導入方法・基本的な使い方について説明してきました。

Input Systemは旧Input Managerとは使い勝手が全然違うので、初めのうちはかなり戸惑ってしまうかもしれません。しかし慣れるととても便利で「こんなに便利なものを使わずに食わず嫌いしていたのか!」と思うこと間違いなしです。ぜひプロジェクトに取り入れて頂ければと思います。

この記事がゲーム制作のお役に立てば幸いです。