意外とヒットモーション時に足を止めるようにするのが難しかった。最初はAnimatorStateInfoでアニメーションの終了を検出しようとしたが、ステートの遷移が含まれると正確に判断できないため断念した。これは2Dのように遷移を補完しないアニメーション向けのようである。
次にノックバックなどのアニメーションクリップの再生時間を取得し、Invokで再生時間後にストップを解除しようとした。しかし、Animatorの再生速度を加味する必要があったのでこれも断念した。
最終的にアニメーションイベントでストップを解除するようにした。ただし、ヒット中にもう一度攻撃を受けると、ステート推移の影響でアニメーションイベントがギリギリ読み込まれる事態が生じてしまった。
つまり、
- 1回目のヒットアニメーション冒頭でストップフラグが立つ
- → 2回目のヒットアニメーション冒頭でヒットでストップフラグが立つ
- →1回目のアニメーション終了時のイベントがギリギリ読み込まれ、ストップフラグが解除される
となり、2回目のヒットアニメーション中の途中から動けるようになってしまった。AnyStateからの推移はCan Transition to Selfにチェックを入れてある。長いことAnyStateを疑っていたが、問題はヒットモーションから待機状態に戻る際にInterrupt SourceがNoneになっていることだった。
つまり、ヒットモーションから待機状態に遷移する際に、この遷移が中断されないせいで待機アニメーション終了時に仕込んだアニメーションイベントが呼ばれていた。
Interrupt Sourceについては
公式マニュアル参照。とりあえず中断させたければ、None以外にすれば良さそう。今回は、ヒットモーションを繰り返して欲しかったのでCurrent State then Next Stateにした。
これにより、いわゆるハメの状態が可能に。処理としてはこちらの方が正しい。あとはハメ対策としてダウン値を設けるなどの工夫をすれば良い。