こんにちは。VisualProgrammerの西条です。
Unity InputSystemの状態遷移。
深く理解していなくても、「なんとなく」使うことはできますが、
BindingされるDeviceによっては予想外の動きとなることもあり、
自分のprogramで使う際は、それぞれが自身で事前に動作確認し、
内部動作をきちんと理解する作業が必須となります。
今回、私自身は、実際にログを取りながら一通り動作させて、
動きを検証しました。
皆さんが検証する際の参考になるよう、これを動画にまとめておきます。

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しているので、ぜひそちらも参考にして下さい。


