【Unity】Input SystemのAxis/Vector系Compositeのモードによる挙動の違い

こじゃらこじゃら

Composite Bindingの1D Axisや2D Vectorでよく分からない設定があるの…

このはこのは

リファレンスにまとめられているけど、実際に動きを見ながら解説していくね。

Input Systemでは、矢印キーやWASDキー、十字キーなどの複数ボタンを一つのスティック入力のように合成して扱うようにする手段Composite Bindingとして提供しています。

参考:Input Bindings | Input System | 1.5.1

次の3種類が存在します。

複数ボタンを合成するComposite Bindingの種類
  • 1D axis正負の2ボタン1軸の入力に合成する
  • 2D vector4方向ボタン2軸のベクトル入力に合成する
  • 3D vector6方向ボタン3軸のベクトル入力に合成する

また、Composite Bindingの合成元となるBindingは、必ずデジタル入力とは限らず、連続的に変化するアナログ入力である可能性があります。

このような入力値をどのように計算して処理するかの設定が可能です。

設定による挙動
  • 元のBindingの入力値をそのまま加工せずに加減算して使用する
  • 閾値を元に0または1に2値化してから使用する
  • 2値化する際、斜め移動は長さ1になるように正規化する

本記事では、これら3種類のComposite Bindingの使い方および設定による挙動の違いについて解説していきます。

動作環境
  • Unity 2022.2.16f1
  • Input System 1.5.1

スポンサーリンク

前提条件

事前にInput Systemパッケージがインストールされ、有効化されているものとします。

ここまでのやり方がわからない方は、以下記事を参考にセットアップを進めてください。

また、Composite Bindingを扱うためには、Input Actionを使用して入力を取得する必要があります。

Input Actionの使い方は以下記事で解説しています。

1D axis

正と負の2つのボタンから1軸の入力に合成するComposite Bindingです。

参考:Input Bindings | Input System | 1.5.1

次のBindingを内包します。

  • Negative – 負方向の入力
  • Positive – 正方向の入力

また、プロパティでは以下パラメータがあります。

  • Min Value – 出力値の最小値。Negativeの入力値が最大になった時にこの値になる。
  • Max Value – 出力値の最大値。Positiveの入力値が最大になった時にこの値になる。
  • Which Side Wins – NegativeとPositive両方の入力があった時の挙動設定。

Which Side Winsは設定によって次のような挙動になります。

Which Side Wins = Negativeのとき

PositiveとNegative両方の入力があったとき、Negative側の入力が優先されます。この時、Positiveの入力値は0とみなされます。

参考:Enum AxisComposite.WhichSideWins| Input System | 1.5.1

この時、出力値は次のように計算されます。

出力値 = ニュートラル値 – (ニュートラル値 – MinValue)* Negativeの入力値

ニュートラル値 = (MaxValue + MinValue) / 2

この計算式によって、ニュートラル値(中間値)からMinValueまでの間で変化する値が得られます。例えば、Negativeが0の時は出力値がニュートラル値、Negativeが1の時は出力値がMinValueになります。

Negativeの入力値を横軸、出力値を縦軸に取ると次のようなグラフになります。

入力値Negativeと出力値の関係

実際の入力と出力結果を可視化すると以下動画のようになります。

Which Side Wins = Positiveのとき

PositiveとNegative両方の入力があったとき、Positiveの入力側が優先されます。この時、Negativeの入力値は0とみなされます。

出力値の計算式は次の通りです。

出力値 = ニュートラル値 + (MaxValue – ニュートラル値)* Positiveの入力値

Positiveの入力値を横軸、出力値を縦軸に取ると次のようなグラフになります。

入力値Positiveと出力値の関係

実際の挙動は以下の通りです。

Which Side Wins = Neitherのとき

打ち消しあってニュートラル値が出力されます。

例えば、Min Valueが-1、Max Valueが1の時、出力値(ニュートラル値)は(1 – 1) / 2 = 0となります。

以下、実際の挙動です。

両方の入力がある間はニュートラル値になっていることが確認できます。

2D vector

4つの入力を2軸入力値に合成するComposite Bindingです。

参考:Input Bindings | Input System | 1.5.1

次の上下左右4方向のボタンのBindingを持ちます。

  • up – 上方向ボタン(y軸正方向)
  • down – 下方向ボタン(y軸負方向)
  • left – 左方向ボタン(x軸負方向)
  • right – 右方向ボタン(x軸正方向)

プロパティはmode1つのみで、上記4方向から2軸値(Vector2)に変換する際の計算方法を設定します。

mode = Analogのとき

x軸およびy軸方向の正負方向の入力値をそのまま加減算するモードです。

次の計算式になります。

出力値 = (x, y) = (right – left, up – down)

値をそのまま加減算するため、ボタンの入力値が0〜1の範囲とすると次の領域となります。

出力値の領域

実際の挙動は以下の通りです。

出力値が連続的に変化しています。

mode = Digitalのとき

4方向の入力をボタン入力値(bool値)に変換してから加減算するモードです。

ボタン入力値は閾値Press Point以上なら1(true)、そうでなければ0(false)という2値化した値です。

斜め方向の補正は行わないため、領域はmodeがAnalogの時と一緒です。

出力値の領域

実際の挙動は以下のようになります。

Analogの時とは異なり、出力値が離散的になっています。

mode = DigitalNormalizedのとき

Digitalと同様に4方向入力をボタン入力値に変換して加減算しますが、斜め方向が長さ1に補正(正規化)されます。

ただし、xy軸どちらも0の場合は(0, 0)を出力します。

したがって、出力値は次のようなダイヤモンド形の範囲となります。

出力値の領域

実際の挙動は以下の通りです。

3D vector

6入力から3軸入力値に合成して出力するComposite Bindingです。

参考:Input Bindings | Input System | 1.5.1

次のような上下左右前後方向のBindingを持ちます。

  • up – 上方向ボタン(y軸正方向)
  • down – 下方向ボタン(y軸負方向)
  • left – 左方向ボタン(x軸負方向)
  • right – 右方向ボタン(x軸正方向)
  • forward – 前方向ボタン(z軸正方向)
  • back – 後ろ方向ボタン(z軸負方向)

プロパティは2D vector同様modeのみです。

modeによる挙動は次のようになります。

mode = Analogのとき

3軸方向それぞれで入力値をそのまま加減算するモードです。

出力値は次のように計算されます。

出力値 = (x, y, z) = (right – left, up – down, forward – back)

各軸方向の入力値をそのまま加減算するため、得られる出力値の範囲は次の立方体の領域となります。

出力値の領域

実際の挙動の様子です。

2D vectorのmodeがAnalogの時と同様、連続的に値が変化していることが確認できます。

mode = Digitalのとき

各入力値をボタン入力値に変換してから加減算するモードです。

計算方法は2D vector同様、z軸成分が増えた事以外は一緒です。出力領域もAnalogと一緒です。

以下、実際に動かした様子です。

出力値が離散的になっています。

mode = DigitalNormalizedのとき

modeがDigitalの時の計算結果に対し、出力値(Vector3)を長さ1に正規化する処理を施します。

ただし、正規化する前の結果が(0, 0, 0)の場合はそのまま(0, 0, 0)を出力します。内部的にはVector3.normalizeプロパティの結果を返しているだけです。

出力される領域は次のような球の内側となります。

出力値の領域

実際に動かした様子です。

2D vectorで円形領域の出力を得たい場合

2D vectorのAnalogモード時、2軸の連続的な値が得られますが、その領域は正方形です。

例えば得られる値(Vector2型)の長さが1を超えないようにしたい場合は、この出力値に対して更に補正をかける必要があります。

これはStick DeadzoneというProcessorを追加すれば解決できます。

Stick Deadzoneデッドゾーンを設定するProcessorですが、最大値を超えないように値を丸める(Clampする)処理も行っています。

参考:Processors | Input System | 1.5.1

出力される領域は以下円形です。

出力値の領域

実際の出力結果です。

Stick Deadzone Processorのより詳細な使い方や挙動については、以下記事をご覧ください。

さいごに

複数入力を1軸、2軸、3軸のベクトルに合成するComposite Bindingはそれぞれ1D axis、2D vector、3D vectorです。

2D vector、3D vectorは各軸方向の入力を加減算した後、モードによって入力値の2値化や正規化が施されます。

一方で、1D axisは正と負の入力値が同時にあった場合の挙動が少し特殊で、どちらか一方の入力を0にするか、両方とも0とするかの選択をするようになっています。単純な加減算ではない事に注意が必要です。

関連記事

参考サイト

スポンサーリンク