Unity_Lesson

Input Systemでデッドゾーンを設定する

コントローラーの製品の劣化などにより、スティックを離しているのに入力値が0とならない場合があります。(このような現象はドリフトと呼ばれます)

また、製品によっては想定より大きな入力値を返してしまうこともあり得ます。

このような問題は、特定範囲の入力値を補正するデッドゾーンを設けることで解決可能です。

デッドゾーンの補正では、ある閾値より小さい入力値は0にし、ある閾値より大きい入力値は1にするような処理を行います。

Input Systemでもこのようなデッドゾーン機能がサポートされています。

スティックのデッドゾーンを設定する

Input Systemにおけるデッドゾーン指定は、Input ActionのProcessorより行います。

指定できるデッドゾーンには、Axis 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つの設定パラメータがあります。

Defaultのチェックを外すことで、デフォルト設定以外の値を個別指定できます。

項目に0を入力すると、自動的にDefaultにチェックが入る仕様になっています。

入力値と出力値のベクトルの長さは、次のグラフのような関係になります


横軸が入力値、縦軸がデッドゾーンを適用した後の出力値です。

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は上から順に実行されていきます。画像の例の場合

という処理が上から順に実行されますが、例えばStick DeadzoneとScale Vector 2を逆にしてしまうと、係数倍(画像では300倍)された値に対して0~1に入力値を正規化するデッドゾーン処理を適用する挙動になってしまい、期待した結果が得られません。

デッドゾーンに限らず、Processorは上から順に実行されることを意識しておくと良いでしょう。