今回は着地モーションをキャンセルする方法についてです。この方法は実際には色々と手があるので、その一つです。
着地モーションと着地モーションキャンセル
高いところから落ちたら際に棒立ちなのは変な事なので、高いところからキャラクターが落下したら、着地時に着地モーションを行いたくなります。
膝を曲げて衝撃を吸収する訳です。
Mecanimでやってみるので、とりあえずステートマシンで「空中になったら落下中モーション→地面に近づいたら着地モーション→モーション完了したら立つモーション」の順になるように設定してみます。
まぁ着地に関しては上手くいきます。
さて、スーパーヒーロー着地のように、高高度からビシっと着地させるならコレでも問題無いのですが、同時に着地モーション時に動かせないのはストレスなので動かしたくなります。
という事で落下直後も普通に移動できるようにすると、しゃがみ中に動いてしまったりします。
今回はコレを何とかします。
着地モーションのキャンセル
キャラクターの移動が始まったら、即座にステートを切り替えるが、基本は着地完了後にステートを切り替えるようにします。
要するにLandingからExitに移動する為の条件を二つ用意する訳です。ORで。片方はHasExitTimeの条件式、もう片方は移動値が少しでもあればOKという感じです。
着地モーション完了まで待ちたくないので、優先順位は移動したら完了を優先とします。
これで着地モーション完了を待たなくとも移動すれば即座にExitステートに切替を開始します。また即座にモーションを切り替えたいので「ブレンド時間は0」としておきます。
着地モーション自体のスキップ
これである程度キャンセルが出来てる訳ですが、場合によっては着地モーションが一瞬表示されてしまう事があります。もしそれが嫌ならば、着地モーション自体をスキップしてしまう力技も無きにしもあらずです。
Interrupt SourceのNext Stateで次のステートが成立してるなら現在のステート切替を終了して次のステートに切り替えてしまいます。
上手く設定すると、こんな感じになります。
ちなみに、
着地モーションのような「状態を持ったモーション」が無いなら、BlendTreeでモーション管理すればキャンセルし放題ですし、ツナギも綺麗です。
もういっそBlendTreeを階層構造にして、落下中→落下終了モーションをブレンドしちゃえばって悪魔の声もします(というか、Mecanimのシステムの本質はコッチなんじゃないかって気がしてますUIの作り込みが微妙なだけで)
また今回はMecanimのGUI制御で色々しましたが、そもスクリプトとPlayableAPIやAnimator.Blendでモーション制御してたら、もっと(プログラマは)楽に出来るんじゃないかなって気もしてますMecaniェ。