ジョイスティックを操作していないのに勝手にキャラが動いてしまって困っているの…
デッドゾーンを設定することで解決できるわ!
コントローラーの製品の劣化などにより、スティックを離しているのに入力値が0とならない場合があります。(このような現象はドリフトと呼ばれます)
また、製品によっては想定より大きな入力値を返してしまうこともあり得ます。
このような問題は、特定範囲の入力値を補正するデッドゾーンを設けることで解決可能です。
デッドゾーンの補正では、ある閾値より小さい入力値は0にし、ある閾値より大きい入力値は1にするような処理を行います。
Input Systemでもこのようなデッドゾーン機能がサポートされています。
本記事では、Input System環境下でデッドゾーンを適用する方法について解説していきます。デッドゾーンの内部処理についても触れます。
- Unity 2021.2.11f1
- Input System 1.3.0
目次 非表示
前提条件
事前にInput Systemパッケージがインストールされ、Input Actionが使用されているものとします。
Input Systemパッケージのインストール方法や使い方が分からない方は、以下記事をご覧ください。
Input Actionの使い方については以下記事をご覧ください。
スティックのデッドゾーンを設定する
Input Systemにおけるデッドゾーン指定は、Input ActionのProcessorより行います。
参考:Processors | Input System | 1.3.0
指定できるデッドゾーンには、Axis DeadzoneとStick Deadzoneの2種類が存在します。
それぞれ次のような特徴があります。
- Axis Deadzone
- 1軸入力の大きさ(絶対値)基準でデッドゾーンを適用する
- 2軸のスティック入力の場合は、もう一方のStick Deadzoneを推奨
- Stick Deadzone
- 2軸入力のベクトルの大きさ(半径)基準でデッドゾーンを適用する
- スティック入力などに適している
なお、これらのProcessorは、Action単位、Binding単位などで指定できます。本記事では、一般的なBinding単位で指定するものとして手順を説明していきます。
デッドゾーンのProcessorを追加する
該当するInput Actionファイルを開き、デッドゾーンを適用したいBindingを選択します。
例では、キャラクター移動操作に使う左スティックに適用するものとします。
Stick Deadzoneを適用するためには、該当するBindingが属するActionのAction TypeがValue、Control TypeがVector2かStickになっている必要があります。
Bindingを選択した状態で右側に表示されるBinding Properties > Processors右の+アイコンをクリックし、Stick Deadzoneを選択します。
すると、Processors項目にデッドゾーンが適用された状態になります。
この状態でSave Assetボタンをクリックすれば設定がInput Actionファイルに保存されます。
デッドゾーンの範囲を設定する
Stick Deadzoneには、次の2つの設定パラメータがあります。
- min
- 2軸入力の大きさがこの値より小さい場合、零ベクトル(0, 0)を返す
- max
- 2軸入力の大きさがこの値より大きい場合、長さ1に正規化されたベクトルを返す
Defaultのチェックを外すことで、デフォルト設定以外の値を個別指定できます。
項目に0を入力すると、自動的にDefaultにチェックが入る仕様になっています。
参考:Processors | Input System | 1.3.0
入力値と出力値のベクトルの長さは、次のグラフのような関係になります。
横軸が入力値、縦軸がデッドゾーンを適用した後の出力値です。
minからmaxまでの入力を0から1に正規化する処理を行っています。範囲外の入力値は0~1の間に丸められます。
デフォルトの範囲を変更する
デッドゾーンのminとmaxのデフォルト設定は、以下Open Input Settingsボタンから変更できます。
ボタンをクリックすると、Project Settingsウィンドウが開かれます。Default Deadzone MinとDefault Deadzone Max項目でデフォルト値を変更できます。
上記画面はUnityエディタトップメニューのEdit > Project Settings…からProject Settingsウィンドウを開き、左側のInput System Package項目を選択することでも表示できます。他にも様々なデフォルト値を変更できます。
デフォルト値の変更はアプリケーション全体の動作に影響を及ぼしますので、十分ご注意ください。
1軸単位でデッドゾーンを設定する
スティック入力のような2軸入力ではなく、1軸入力に対して適用できるデッドゾーンもあります。
この場合、Axis DeadzoneをProcessorに追加します。Axis Deadzoneを追加するためには、該当するActionのControl TypeがAxisなど1軸の入力値になっている必要があります。
Axis Deadzoneの追加もStick Deadzoneと同様、該当するBindingを選択した状態でProcessor右の+アイコンから追加してください。
Axis Deadzoneの入力値補正処理も、基本的にStick Deadzoneと一緒です。絶対値に対してminとmaxの間の入力値を0~1の範囲に正規化する処理を行います。
複数のProcessorが存在する場合は順番に注意
次のように複数のProcessorを追加する場合、追加する順序に注意する必要があります。
登録されたProcessorは上から順に実行されていきます。画像の例の場合
- Invert Vector 2 (入力値反転)
- Stick Deadzone(デッドゾーン適用)
- Scale Vector 2(入力値に対して係数を掛ける)
という処理が上から順に実行されますが、例えばStick DeadzoneとScale Vector 2を逆にしてしまうと、係数倍(画像では300倍)された値に対して0~1に入力値を正規化するデッドゾーン処理を適用する挙動になってしまい、期待した結果が得られません。
デッドゾーンに限らず、Processorは上から順に実行されることを意識しておくと良いでしょう。
さいごに
スティック入力のドリフト現象は、デッドゾーンを適用すると解決可能です。
Input Systemでは、Processorという形で個別のBindingやActionに対してデッドゾーンを適用できます。
デッドゾーンはコントローラーによって相応しい設定値が異なる可能性があるため、キーコンフィグ機能などで自由に調整できるようにしておくと安心かもしれません。