Unityでキーボード・マウス・ゲームパッド等の入力を扱うやり方といえば、従来は
- Input Managerでボタン等を設定し、
- Inputクラスで入力を取得する
という方法が一般的でした。ただしこのやり方は単純で分かりやすい反面、例えば色々な入力デバイスに対応しようとするとかなり面倒なことになる等のデメリットがありました。
そんな中Unity2019で全く新しい入力システムである「Input System」が登場。より柔軟に入力を扱えるようになったのはご存じの方もいらっしゃると思います。
…ところがInput Systemは
- パッと見ではどうやって使えばいいのか全然分からない
- 執筆時点では(登場からしばらく経っているにもかかわらず)使い方などの情報が乏しい
という感じなので、「あるのは知ってるけど全然使う気にならないなぁ」という方が多いのではないでしょうか。しかしこのInput Systemは画期的で便利な入力システムなので、皆さんもっと使ってみたほうが良いのではないかと思います。
そこでここでは
- Input Systemとは何か。Input Managerとどう違うのか?
- どうやって使うのか?
といったことについて説明していきますね。
「Input System」の特徴は?旧Input Managerとの違いは何か?
でははじめに
- Input Systemにはどういう特徴があるのか
- Input Managerとの違いはどんな部分か
というところから説明しましょう。
Input SystemはInput Managerの後継機能ではありますが、根本的な仕組みが大きく異なるのでその特徴はかなり違います。新しいInput Systemの主な特徴を挙げると次のような感じになります。
- 入力を「アクション」という単位で扱う
- 色々なデバイスに柔軟に対応できる
- 入力を手軽に変更・カスタマイズすることができる
特徴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ステップです。
- パッケージマネージャからInput Systemをインストールする
- Input System全体の設定ファイルを作る
- プレイヤー設定でInput Systemを使うように設定する
- EventSystemがある場合はモジュールを変更する
手順1:パッケージマネージャからInput Systemをインストールする
まずはパッケージマネージャからInput Systemのパッケージをインストールします。
インストール中に下のようなダイアログが出るので、「Yes」をクリックします(※これにより旧Input Managerが無効化され、代わりにInput Systemが有効になります)。するとUntiyエディタが再起動します。
※間違って「No」をクリックした場合はこのあとの手順3の作業が必要です。
手順2:Input System全体の設定ファイルを作る
次にProject Settingsウィンドウ(メニューバーの「編集」→「プロジェクト設定」)を開き、「Input System Package」の「Create settings asset」ボタンをクリックしてInput System全体の設定ファイルを作ります(下図)。
手順3:プレイヤー設定でInput Systemを使うように設定する
もし手順1のダイアログで「No」を押した場合はプレイヤー設定でInput Systemを使うように設定します(※ダイアログで「Yes」をクリックした場合は既に設定されているのでこの手順の作業は不要です)。
メニューバーの「編集」→「プロジェクト設定」からProject Settingsウィンドウを開き、「Player」→「その他の設定」と展開します。下の方に「アクティブな入力処理」という欄があるので、そこで「入力システムパッケージ(新)」を選んでください(下図)。
※設定を変更するとUnityエディタが再起動するのでご注意ください。
手順4:EventSystemがある場合はモジュールを変更する
最後にUI用の「EventSystem」が既にプレハブやシーンにある場合は、そのモジュールをInput Systemのものに置き換えます。Input Systemをインストールしてあると置換ボタンが表示されるのでそれを押せばOKです。
Input Systemの基本的な使い方
さて、前置きが非常に長くなってしまいましたがここからが本題です。Input Systemの基本的な使い方(=設定&利用方法)について説明していきますね。
- Input Actionsファイルを作って設定を行う
- 入力を取得するゲームオブジェクトにPlayer Inputコンポーネントをつける
- スクリプトから入力を取得する
手順1:Input Actionsファイルを作って設定を行う
まずは「Input Actions」と呼ばれる入力の設定ファイルを作ります。適当なフォルダで右クリック→「作成」→「Input Actions」から新しいInput Actionsファイルを作りましょう。
そうしたらそれをダブルクリックしてInput Actions編集ウィンドウを開き、次のような手順で設定作業を行います。
- Control Schemeを作る
- Action Mapsを作る
- Actionを作って入力を割り当てる
Control Schemeを作る
はじめに「Control Scheme」という入力のカテゴリのようなものを作ります。これは例えば
- キーボード&マウス
- ゲームパッド
- タッチ入力
といった感じに作ればOKです。
作り方ですが、Control SchemeはInput Action編集ウィンドウ左上の「All Control Schemes」と書かれているメニューのところから新規作成・編集できます(下図)。
「Add Control Scheme」を選択すると新しいスキームを追加できます。その場合はスキームの名前を入力し、対応する入力機器を選べばOKです。
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を設定します。
手順3:スクリプトから入力を取得する
最後にC#スクリプトから入力を取得すればOKです。
input = playerInput.currentActionMap["Move"].ReadValue<Vector2>();
旧Input Managerからの乗り換え方法
ところでInput Systemを使い始めると「Input ManagerでやってたことをInput Systemで置き換えたいけどよく分からん!」という場合もよくあると思います。そのような場合は下記ページ(Input System公式マニュアル)を参考にすると良いでしょう。
おわりに
以上、UnityのInput Systemの概要や導入方法・基本的な使い方について説明してきました。
Input Systemは旧Input Managerとは使い勝手が全然違うので、初めのうちはかなり戸惑ってしまうかもしれません。しかし慣れるととても便利なので感動すること間違いなしです。ぜひプロジェクトに取り入れて頂ければと思います。
この記事がゲーム開発のお役に立てば幸いです。