tanaka's Programming Memo

プログラミングについてのメモ。

【Unity】InputSystemのPass Throughってなんだっけ

Pass Throughとはなんぞや、というのをすぐに忘れるので、ざっくり整理です。情報源は、以下の公式マニュアルです。

docs.unity3d.com

目次

ActionTypeとは

ActionTypeは、主に次の2つの動作を設定するものです。

  1. アクションの値の変更に対するstarted、performed、canceledの呼び出し方
  2. 同じアクションに複数のコントローラーの操作がバインドされていた時の、入力値の選択方法

それぞれ、以下のとおりです。

Pass Through

  • 値が変更されたら、performedで通知
  • Interactionを追加しなければ、値の変更に伴うstartedやcanceledは呼び出さない
  • 同じアクションに、複数のコントローラーが割り当てられていた場合、すべてのコントローラーの変化を報告する。入力値によらず、最後に変化したコントローラーの入力が得られる
  • ボタンタイプの入力を割り当てた場合、値が変化するたびにperformedが呼ばれるので、performed内でReadValueAsButton()を使うと、ボタンを押したか、離したかを判定できる

Value

  • 入力値が、デフォルト値から変化すると、startedが呼び出される
  • startedの呼び出し後、同じフレームですぐにperformedが呼び出される
  • その後、デフォルト値になるまで、値の変化ごとにperformedが呼び出される
  • 値がデフォルト値になると、canceledが呼び出される
  • Initial state checkを有効にすると、操作が有効になった瞬間に、入力がデフォルト値かどうかを判定して、デフォルト値でなければ、startedとperformedを呼び出す
    • シーンの切り替えなどの直後に、前のシーンの入力が残っていた場合に、その入力を有効にしたいならチェックする
  • 1つのアクションに、複数のコントローラーの入力が割り当てられていると、そのうちの入力値が一番大きいもののみが通知される

Button

  • 入力値が、規定の値以上になったら、startedが呼び出されて、同じフレームですぐにperformedも呼び出される
  • 入力値が、規定の値未満になったら、canceledが呼び出される
  • その他の機能は、Valueとほぼ同じ
  • 1つのアクションに、複数のコントローラーの入力が割り当てられていると、そのうちの入力値が一番大きいものを通知する
  • あるアクションにデジタル入力のコントローラーを複数バインドした場合、先に押された操作が離されない限り、他の入力が押されても無視される

まとめ

  • Pass Through
    • 最後に操作されたコントローラーの入力を取得したい場合
    • startedやcanceledが不要な場合
    • アクションゲームの操作など、素早いレスポンスや、最新の変化を反映したい場合に向いている
    • マウスの座標などのデフォルト値に戻らない入力
  • Value
    • デフォルト値があるコントローラーの移動操作など向き
    • started、canceledが使いたい場合
    • デフォルト値からの違いが一番大きいコントローラーの入力のみを取得したい場合
  • Button
    • クリックやタッチ、ボタンなどを取得したい場合
    • 先に押しっぱなしにした操作があったら、他の操作は無効にしたい場合

基本的には、Unityがデフォルトで生成するInputSystem_Actionsを参考にするのがよいです。

Unity6.xでプロジェクトを作成すると、自動的にデフォルトのInputActionが生成される

移動操作はVector。AttackやJumpはButton。UIのマウス座標などは、Pass Throughに設定されています。

移動操作は、接続しっぱなしのゲームコントローラーのアナログ入力が微妙に残る場合があります。そうすると、キー操作をしていて、キーを離しても、ゲームコントローラーの入力の影響で、微妙にキャラが移動することがあります。そのような場合は、Pass Throughの方が便利な場合があります。

参考URL