UnityのInput SystemのControl Schemeを使ったそのデバイスに適した入力の設定を使用する方法をまとめました。
Unity2020.1
はじめに
この記事ではUnityのInput System(Unity2020で正式リリースされた新しい方)のControl Schemeを使って、
デバイスごとに適した入力のセットを適用する方法についてまとめます。
Input Systemの基礎知識は以下の記事にまとめていますので、必要に応じて参照してください。
Control Scheme?
Input Action Assetのエディタの左上を見るとControl Schemeというものが設定できることがわかります。
このControl Schemeを使うと、そのBindingを適用するデバイスの条件を細かく設定できます。
言葉で説明してもよくわからないので実際に設定していきます。
まず先ほどのエディタ左上のボタンからAdd Control Schemeを選択して新しくControl Schemeを作成します。
名前はKeyboard&Mouseとし、その下のデバイスリストにはKeyboardとMouseを設定します。Requirementsは両方ともRequiredにしておきます。
同様にTouchscreenのみRequiredにしたControl Schemeを作成します。
次に左上メニューからAll Control Schemesを選択して、アクションを登録していきます。
今回はFireアクションにタッチと左クリックのバインディングを登録しました。
ここで、バインディングの設定欄に先ほど作成したControl Schemeのチェックボックスが現れていることが確認できます。
ここにチェックを入れると、このバインディングは指定したControl Schemeの条件でしか動作しなくなります。
つまりこの場合、Left Buttonバインディングはキーボードとマウスを両方とも備えている端末でしか動作しなくなります。
ちなみにどのControl Schemeにもチェックを付けていないバインディングはGlobalとなり、
Control Schemeの条件を満たしていなくても、入力デバイスがあれば使えるようになります。
基本的にPlayer Inputと一緒に使う
Control Schemeは基本的にPlayer Inputコンポーネントと一緒に使います。
Player InputにInput Action Assetを設定することで端末に適したControl Schemeを選択してくれます。
適したControl Schemeがなかった場合には例外がスローされます。
またControl SchemeがInput Action Assetに一つも定義されていなかった場合には、PlayerInputは可能なバイディングを全て使おうとします。
よって、Control Schemeを設定する場合には対応する端末で例外が発生しないように設定する必要があります。
使いどころは?全部Globalでいいのでは?
さてここまでの仕様を整理すると、わざわざControl Schemeを設定せずにすべてのバインディングをGlobalにしておけばいいのではないかという疑問が生まれます。
これに関してはPlayer Inputを使わなかったり、バインディングの有効性を細かく設定しない場合には設定なしでいいのではないかと思っています。
例えば、GamePad(PS4のコントローラとか)で二つコントローラが有効になっていたら違うバインディングを使うとか、
Touchscreenが有効だったらバインディングAを使うが、さらにジャイロセンサーが有効だったら代わりにバインディングBを使うとか、
そういった複雑な制御を行う場合にはControl Schemeの仕組みを使う必要がありそうです。