【検証してみた】unity InputSystemの状態遷移 ちゃんと理解してますか?

Engineering

こんにちは。VisualProgrammerの西条です。

Unity InputSystemの状態遷移。
深く理解していなくても、「なんとなく」使うことはできますが、
BindingされるDeviceによっては予想外の動きとなることもあり、
自分のprogramで使う際は、それぞれが自身で事前に動作確認し、
内部動作をきちんと理解する作業が必須となります。

今回、私自身は、実際にログを取りながら一通り動作させて、
動きを検証しました。
皆さんが検証する際の参考になるよう、これを動画にまとめておきます。

Nobu
Nobu

この動画は、次のような方におすすめです

  • 結果だけ見せられても、自分の目で確認するまで 信用できない
  • 結果だけでなく、Processを教えてくれ(自分でやってみるつもり)
  • 参考までに結果も教えて欲しい
contents
  • 準備
    • project作成
    • InputActionsFile作成・設定
  • 状態遷移を解析するためのscript
  • interactionの中身をstudy
  • 状態遷移 : 検証結果

それでは、ご覧ください。

各phase下での、各関数の動作は以下の通りです。

実際に検証した状態遷移の結果を、いくつか掲載しておきます。

以下に、Pointを整理しておきます。

Point整理
  • InputAction::ReadValue<>() は、phase == Waiting or Canceledの時、実際の入力値に関わらず、zeroが返ってくる(仕様)
  • Gamepad.current.rightTrigger.ReadValue(); のように、直接、入力を指定してReadValue()する場合は、phaseに依らず、入力値を取ることが可能。
  • phase == Waiting に遷移する際は、Eventが飛んでこない。
    Waitingへの状態遷移をDebug.Log()したい場合は、Update()内でこれを捕まえる。
  • “ActionType == Value”の時などは、”performed”が連続して飛んでくるので、Debug.Log()が流れて行かないよう、表示回数制限を設ける、などの工夫が必要。
  • “InputSystemの状態遷移”は、全て、interaction(script)の中に書かれている。
  • ActionTypeのみを設定し、interactionを設定しない場合は、defaultのinteractionで動作している。
  • originalのinteractionを作成するには
    • “IInputInteraction” interfaceを継承する。
    • Initialize(), Process(), Reset() の3関数を定義する。
    • Initialize()で自身(class)をInputSystemにRegisterする。
  • phaseは、Waiting、Started、Performed、Canceled の4つ(Disabledはscript内では扱わない)
  • 状態遷移、及び、Event triggerは、Started(), Performed(), PerformedAndStayPerformed(), PerformedAndStayStarted(), Canceled(), Waiting()、の各関数でControlする。
  • pushされたたどうかは、ControlIsActuated( thresh )
  • interactionで変数をinspectorに出すには、publicを使う(SerializeField attributeは効かない)
  • SetTimeout
    • SetTimeout()でtimersetすると、timeout時、入力に変化がなくてもProcess()がcallされる
    • Started(), Performed(), PerformedAndStayPerformed(), PerformedAndStayStarted(), Canceled(), Waiting() のいずれかをcallすると、timerはcancelされる
    • timerHasExpired == trueの時、ControlIsActuated()は必ずfalseになる(動作検証の結果。Documentはない)
    • interactionは、ActionにBindingされた入力に対して、それぞれclass objectが生成され、状態遷移が走る。

また、他にもUnityに関する動画をUpしているので、ぜひそちらも参考にして下さい。

タイトルとURLをコピーしました