InputSytem
Input Sytemは、Input Managerに変わる新しい入力管理方法で、タッチもコントローラーも、キーボードもマウスも、同列に定義できる優れものです。
InputSystemの導入は色々調べてやってください。
forpro.unity3d.jp
ちょっと判りにくい?コールバック
で、コールバックに関して、ちょっと判りにくいところがあって、
ちまたでも、勘違いの筆頭で、あまり調べずに「まだ安定してない!バグだ!」って言われたりしたりもします。
コールバックが複数回呼ばれちゃう?
それが、例えばFireというアクションを設定すると、OnFireというコールバックを受け取ることになるんですが、
「Press Only」に設定しているのにもかかわらず、複数回OnFireが呼ばれる。ということです。
これは本当であり、間違いです。
コールバックにはフェーズがある
たとえば、以下の様に設定すると、
OnFireレベルで考えると同じコールバックが複数回呼ばれます。
で、以下の様に、contextの中からphaseを確認してみると
public void OnFire(InputAction.CallbackContext context)
{
Debug.LogFormat("OnFire Type:{0}", context.phase);
}
コールバックにはStared/Performed/Canceledという3段階
があることが判ります。
Press Onlyにしても複数回呼ばれる?
このInputActionにはInteractionという設定があり、イベントの発行タイミングが設定可能になっています。
こんがらがってしまうのが、
じゃあ、Press Onlyを設定するとどうなるかというと、同じく3段階で呼ばれてしまいます。
じゃあ、このPress Onlyってなんだ?っていうと、
Performedのコールバックが発行されるタイミング
になります。
つまり、Press Onlyは
Release Onlyは
ということで、Press & Releaseになると、
Performが2回!
こうなるわけですね。
どう対応するか?
結局、ざっくり使う場合に頭の中で想定されるのは大体はPerformの部分なので、
シンプルに
public void OnFire(InputAction.CallbackContext context)
{
if (context.performed)
{
Debug.LogFormat("OnFire Type:{0}", context.phase);
}
}
にしてしまうか、
ActionInputインスタンスのperformedイベントに登録してしまうことで、
{
_fireInput.performed += context => Debug.Log("OnFire!"));
}
意図通りの挙動を再現できるのではないでしょうか。