Unityのアニメーションでは以下のようにGUIのState Machineを使える:
初めてこれを知った時、アニメの制御はすべてこのシステムだけにして、スクリプトは完全に入力を反応するにしたいが、いくつの理由でそれを叶わない:
即時性がない
上の図のAttackをtrueにする
anim.SetTrigger("Attack");
AnimatorStateInfo info = anim.GetCurrentAnimatorStateInfo(0);
StateはAttackのStateに変わるはずだが、でもAnimatorStateInfoの値は元のStateのまま、Blendingなどいろいろな理由ですぐに変えない。なので即時性が必要な判断は出来ない。
例えば、”ジャンプする時に何かできない、同じく何かをやる時ジャンプができない”を実現する場合は、入力でジャンプを押したのに、実際はまだジャンプの状態に入ってないから他のことはまだできる、そしてそのことをやっている時、ジャンプしっちまった。
無効なに入力を取り消さない
一度trueにしたtriggerは設定したStateに変わるとfalseに戻る。でも、言わばそのStateに変わる前にずっとtrueのまま、それは問題になる。
例えば、ジャンプする時に攻撃ができない場合は、ジャンプのstateでAttackを押した、ジャンプのstateはAttackのStateに変えないから何も起こらないが、着地後Idleに戻るから、Attackのstateに変える、そしてこの時AttackのTriggerはtrueのままだから、攻撃しっちゃう。
最後に
Unityのアニメーションシステムはまだ完全理解し切れていないが、今理解している範囲ではやはりまだスクリプトに頼るしかない。