読者です 読者をやめる 読者になる 読者になる

テラシュールブログ

旧テラシュールウェアブログUnity記事。主にUnityのTipsやAR・VR、ニコニコ動画についてのメモを残します。

【Unity】着地モーションをキャンセルして即座に走り出す

f:id:tsubaki_t1:20161218201044j:plain

今回は着地モーションをキャンセルする方法についてです。この方法は実際には色々と手があるので、その一つです。

着地モーションと着地モーションキャンセル

高いところから落ちたら際に棒立ちなのは変な事なので、高いところからキャラクターが落下したら、着地時に着地モーションを行いたくなります。
膝を曲げて衝撃を吸収する訳です。

f:id:tsubaki_t1:20161218202108g:plain

Mecanimでやってみるので、とりあえずステートマシンで「空中になったら落下中モーション→地面に近づいたら着地モーション→モーション完了したら立つモーション」の順になるように設定してみます。
まぁ着地に関しては上手くいきます。

f:id:tsubaki_t1:20161218202910j:plain

さて、スーパーヒーロー着地のように、高高度からビシっと着地させるならコレでも問題無いのですが、同時に着地モーション時に動かせないのはストレスなので動かしたくなります。

という事で落下直後も普通に移動できるようにすると、しゃがみ中に動いてしまったりします。

f:id:tsubaki_t1:20161218201833g:plain

今回はコレを何とかします。

 

着地モーションのキャンセル

キャラクターの移動が始まったら、即座にステートを切り替えるが、基本は着地完了後にステートを切り替えるようにします。

要するにLandingからExitに移動する為の条件を二つ用意する訳です。ORで。片方はHasExitTimeの条件式、もう片方は移動値が少しでもあればOKという感じです。

着地モーション完了まで待ちたくないので、優先順位は移動したら完了を優先とします。

f:id:tsubaki_t1:20161218203719j:plain

これで着地モーション完了を待たなくとも移動すれば即座にExitステートに切替を開始します。また即座にモーションを切り替えたいので「ブレンド時間は0」としておきます。

f:id:tsubaki_t1:20161218204339j:plain

着地モーション自体のスキップ

これである程度キャンセルが出来てる訳ですが、場合によっては着地モーションが一瞬表示されてしまう事があります。もしそれが嫌ならば、着地モーション自体をスキップしてしまう力技も無きにしもあらずです。

Interrupt SourceのNext Stateで次のステートが成立してるなら現在のステート切替を終了して次のステートに切り替えてしまいます。

f:id:tsubaki_t1:20161218204921j:plain

 

上手く設定すると、こんな感じになります。

f:id:tsubaki_t1:20161218205354g:plain

ちなみに、

着地モーションのような「状態を持ったモーション」が無いなら、BlendTreeでモーション管理すればキャンセルし放題ですし、ツナギも綺麗です。
もういっそBlendTreeを階層構造にして、落下中→落下終了モーションをブレンドしちゃえばって悪魔の声もします(というか、Mecanimのシステムの本質はコッチなんじゃないかって気がしてますUIの作り込みが微妙なだけで)

f:id:tsubaki_t1:20161218210820j:plain

また今回はMecanimのGUI制御で色々しましたが、そもスクリプトとPlayableAPIやAnimator.Blendでモーション制御してたら、もっと(プログラマは)楽に出来るんじゃないかなって気もしてますMecaniェ。

関連

tsubakit1.hateblo.jp

tsubakit1.hateblo.jp