Unityの入力システム「 Input System」で使用するInput Actionのオプション項目「Processor」の解説とデフォルトの機能、及び自作する方法を解説します。
Table of Contents
Processorとは
ProcessorsはInputActionを設定する際のオプション項目の一つで、「ベクトルの正規化(単位ベクトル化)」、「0、1付近の端数を0,1に変更」「+-符号を逆転化」等の数値を変更します。入力デバイスから届いた値は、ここで数値を変更して最終的に出力します。
Axis Deadzone
0、1、-1の近似値を丸めます。入力デバイスで押してない状態が誤作動でちょっとだけ押していて0、01などのような誤差を押したことにするための処置です。
Operand Type : float
値が絶対値でminより小さい場合は丸めて0にし、maxよりも高い場合は丸めて1,-1にします。
Clamp
値をクランプします。
Operand Type : float
値がMinより小さい場合はMinを値がMaxより大きい場合はMaxにして返します。
Invert
float値を反転させます。
Operand Type : float
値が-の場合は+になり、+の場合は-になります。
Invert Vector2
Vector2を反転させます。
Operand Type : Vector2
Invert Xにチェックが入っている場合、X軸の値が-の場合は+になり、+の場合は-になります。
Invert Yにチェックが入っている場合、Y軸の値が-の場合は+になり、+の場合は-になります。
Invert Vector3
Vector3を反転させます。
Operand Type : Vector3
Invert Xにチェックが入っている場合、X軸の値が-の場合は+になり、+の場合は-になります。
Invert Yにチェックが入っている場合、Y軸の値が-の場合は+になり、+の場合は-になります。
Invert Zにチェックが入っている場合、Z軸の値が-の場合は+になり、+の場合は-になります。
Normalize
正規化します。
Operand Type : float
Min:最小値 Max:最大値 Zero:中心値
以下の計算はZero < Minの時、Zero = Minと置き換えた上で行います
- 値 = Min、且つMin >= Zeroの場合、0f
- 値 = Min、且つMin < Zeroの場合、-1f
- Min < Zeroの場合、2 × (値 – Min) / (Max – Min) – 1
- 上記以外の場合、(値 – Min) / (Max – Min)
Normalize Vector2
Vector2を正規化します。
Operand Type : Vector2
値を単位ベクトルに変換します。value.normalizedと同じことをしています。
Normalize Vector3
Vector3を正規化します。
Operand Type : Vector3
値を単位ベクトルに変換します。value.normalizedと同じことをしています。
Scale
値に倍率を掛けます。
Operand Type : float
値にFactorを掛けます。
Scale Vector2
Vector2に倍率をかけます。
Operand Type : Vector2
(a,b)のaにx倍、bにY倍を掛けます。
Scale Vector3
Vector3に倍率をかけます。
Operand Type : Vector3
(a,b,c)のaにx倍、bにY倍、cにZ倍を掛けます。
Stick deadzone
0、1、-1の近似値を丸めます。入力デバイスで押してない状態が誤作動でちょっとだけ押していて0、01などのような誤差を押したことにするための処置です。
Operand Type : stick
値が絶対値でminより小さい場合は丸めて0にし、maxよりも高い場合は丸めて1,-1にします。
自作Processorを追加する
Processorは、自作して追加することがで簡単にできます。以下は、入力デバイスの値に指定数を足して出力するプロセッサーです。
using UnityEngine;
using UnityEngine.InputSystem;
#if UNITY_EDITOR
using UnityEditor;
#endif
#if UNITY_EDITOR
[InitializeOnLoad]
#endif
public class MyProcessor : InputProcessor<float>
{
#if UNITY_EDITOR
static MyProcessor()
{
Initialize();
}
#endif
[RuntimeInitializeOnLoadMethod]
static void Initialize()
{
InputSystem.RegisterProcessor<MyProcessor>();
}
[Tooltip("入力デバイスの値にこの値を足します。")]
public float valuePlus = 1;
public override float Process(float value, InputControl control)
{
return value + valuePlus;
}
}
Processors横の+にMy が追加され、選択すると独自のプロセッサーが選択できます。では、順番に見ていきます。
public class MyProcessor : InputProcessor<float>
自作プロセッサーはInputProcessorを継承します。タイトルは「~Processor」にすると、InputActionは~の部分をタイトルにします。型を指定することで、その型のOperand Systemにしか対応しないことを明示します。
今回の場合はButtonはFloat型のため、ButtonのProcessor選択欄では追加できますが、他の形式Vector2などではそもそも項目が現れません。
[InitializeOnLoad]
~
static MyProcessor()
{
Initialize();
}
[RuntimeInitializeOnLoadMethod]
static void Initialize()
{
InputSystem.RegisterProcessor<MyProcessor>();
}
自作プロセッサーをInput Systemに登録しています。InitializeOnLoadを利用することにより、エディタ起動時に処理が走ります。
[Tooltip("入力デバイスの値にこの値を足します。")]
public float valuePlus = 1;
変数はPublicやシリアライズしたPrivateなどはInspector入力項目に追加されます。
public override float Process(float value, InputControl control)
{
return value + valuePlus;
}
オーバーライドしたProcessメソッドにて、実際の値変換処理を行います。戻り値とvalueの型は、クラス宣言時の型と同じにします。