Unityで空中にいる時、着地時のアニメーション切り替えをする機能

今回はUnityのアクションゲーム等でキャラクターが高い所から落ちた時に落ちている時のアニメーション、

落ちてから地面に着地する時に着地するアニメーションを再生するようにしたいと思います。

高い所から落ちると言っても、10cmぐらいの高さから落ちた時も落ちるアニメーションを再生するとおかしい事になるので、ある程度の高さから落ちた時だけ再生するようにする為、レイを使って地面との距離を調べます。

着地に関してもレイを使って地面との距離を計り、一定の距離に来たら着地アニメーションを再生させるようにします。

落下と着地のアニメーション再生機能

スポンサーリンク

サンプルの舞台を作成する

まずはサンプルの舞台を作成していきます。

特別こうしなければいけない!

というのはなく、元になる地面と高い場所を作成し、キャラクターが落下出来る場所を作るだけです。

高い所から落ちれるサンプル舞台

↑のような感じで階段と坂で高い場所にキャラクターが移動出来るようにします。

↓のように空のゲームオブジェクトを作り名前をFieldとし、その中にスタンダードアセットのPrototypingの素材を使って舞台を作りました。

Prototypingを使った高い所から落ちれるサンプルヒエラルキー

Prototypingについては

UnityのスタンダードアセットのPrototypingにあるブロックを使って、簡単なゲームの舞台を作ってみます。

を参照してください。

Fieldを含め子要素の地面となるゲームオブジェクトにはFieldレイヤーを作り設定します。

地面となる場所はFieldレイヤーを設定

これでサンプル舞台が完成しました。

キャラクターの作成

キャラクターのCharacterControllerを使った基本的な移動やAnimatorの作り方に関しては

Unityで3Dキャラクターモデルを配置し、キャラクターをCharacterControllerの機能を使って移動させるようなプログラミングをしてみます。
Unityのアニメーションを切り替える為のアニメーターの設定とアニメーションの遷移をさせるスクリプトの作成を行います

を参照してください。

使用するアニメーションの用意

今回使用する落ちている時のアニメーションと着地のアニメーションを用意します。

Idle、Walkの時のアニメーションはスタンダードアセットにあるアニメーションを使用してください。

落ちている時のアニメーション

まずは落ちている時のアニメーションですが、これはAssets→StandardAssets→Characters→ThirdPersonCharacter→Animation→HumanoidIdleJumpUpをCtrl+Dキーでコピーし使用します。

コピーしたら名前をFallにします。

落ちている時のアニメーション

落ちるアニメーション以外のClipを削除し、PoseのBakeにチェックを入れていきます。

落ちている時のアニメーションの設定

アニメーションは

落下アニメーション

↑のような感じです。

着地のアニメーション

着地のアニメーションはアセットストアでraw mocap animationで検索して出てくる無料のアニメーションを使用します。

インポートしたらAssets→RawMocapData→Animations→Interacting→Idle_JumpDownHigh_IdleをCtrl+Dキーでコピーします。

コピーしたら名前をLandingに変更し、アニメーションを切り取ります。

着地アニメーションの一部を切り取る

アニメーションの切り取りに関しては

Unityに取り込んだキャラクターのアニメーションでアニメーションを切り分けたり、一部アニメーションだけ切り取って使う方法。

を参照してください。

アニメーションは

着地アニメーション

↑の部分を使用します。

AnimatorControllerの作成

キャラクターに設定するAnimatorControllerを作成していきます。

アニメーションパラメータにBool型のFallとLandingを作成し、Fall状態にFallアニメーション、Landing状態にLandingアニメーションを設定し、以下のような遷移を作成します。

落ちる着地するキャラクターのAnimator

Idle→FallはFallがtrueになった時
Fall→IdleはFallがfalseになった時
Walk→FallはFallがtrueになった時
Fall→LandingはLandingがtrueになった時
Landing→IdleはLandingがfalseになった時

でそれぞれの遷移のアニメーションブレンドは、

LandingからIdleへの遷移条件

↑のようにすぐに切り替わるようにします。

またLandingからIdleへの遷移条件のSettingsのInterrupion SourceはNext Stateにし、着地後すぐに移動したら歩くアニメーションへと遷移するようにします。

Landing状態を選択し、インスペクタでFoot IKのチェックを入れます。

またAdd Behaviourで新しいビヘイビアを作成し、取り付けます。

OnStateUpdateでアニメーションの再生が80%終了したらアニメーションパラメータのLandingをfalseにします。

通常のスクリプトでcharacterController.isGroundedで地面と接地した時にLandingをfalseにする事も出来ますが、それだと着地アニメーションの再生が終わる前に遷移してしまう為、

ビヘイビアを使ってLandingをfalseするようにしました。

Landing状態の設定

キャラクター操作スクリプトの作成

キャラクター操作スクリプトを作成していきます。

設定部分とStartメソッド

まずは設定部分とStartメソッドから記述していきます。

distanceToTheGroundはキャラクターが地面と接地していない時に下の地面との距離を入れます。

地面から落下する時にこの距離以上だったら落下アニメーションにします。

distanceToLandingは落下アニメーション中に下にレイを飛ばし、地面との距離を計り、この距離以内になったら着地アニメーションにします。

spineはレイを飛ばす元の位置です(ボーンを設定する為、そのボーンの名前にしました)。

StartメソッドでSpineのボーンを取得し設定しています。

Updateメソッド

Updateメソッドでは地面に接地している時、落下時、落ちているアニメーションの時で処理を分岐させています。

キャラクターが接地した時はアニメーションパラメータのFallをfalseにしています。

また、移動した時はアニメーションパラメータのLandingをfalseにし着地アニメーションを終了させています。

地面に接地していない時でアニメーションパラメータのFallがfalseの時はキャラクターのspineから下にレイを飛ばし、地面に接地しなければアニメーションパラメータのFallをtrueにし落ちる時のアニメーションにします。

ここで落ちる高さが低い時は落ちる時のアニメーションにはしません。

落下アニメーションの時はspineから下にレイを飛ばし、地面に接触したら着地アニメーションへと遷移させています。

これで全ての機能が完成しました。

高い所から落下し確認する

機能が完成したので、実際にキャラクターを動かし低い所と高い所から落下させて確認してみましょう。

キャラクターのインスペクタは↓のように設定しました。

落下と着地キャラクターのインスペクタの設定

↑のようになりました。

細かいアニメーションの切り替えがあると少し本格的になった感じがしますね。(^^)/

スポンサーリンク

記事をシェアして頂ける方はこちら

フォローして頂くとやる気が出ます

コメント

  1. 匿名 より:

    返信遅れました。
    ありがとうございます!
    後の調整はこちらで行います!
    助かりました!

  2. 匿名 より:

    これは着地とは関係ないんですが…。

    ジャンプ→落下のアニメーションと
    何もせずの高所から落下のアニメーションを別々にしたいんですが、判別の方法は何か無いでしょうか?

    • AnimatorControllerでジャンプ状態からジャンプ用落ちるアニメーション状態に条件なしのHas Exit Timeにチェックを入れて遷移させて、着地したらJumpフラグを解除するようにすればいけると思います。

      ジャンプから落ちるのと普通に落ちるアニメーションを変える

      条件は

      Idle→JumpはJumpがtrueでHas Exit Timeのチェックを外し
      Walk→JumpはJumpがtrueでHas Exit Timeのチェックを外し
      Jump→JumpFallは条件なしでHas Exit Timeにチェックを入れる、Interruption SourceにNext State
      JumpFall→IdleはJumpがfalseでHas Exit Timeのチェックを外し、Interruption SourceにNext State
      JumpFall→LandingはLandingがtrueででHas Exit Timeのチェックを外し

      この記事の着地機能を取り付ける場合はスクリプトも少し変更します。

      とEndLandingsビヘイビアを変更します。

      ジャンプをした後の落下はジャンプアニメーションの終了とともにジャンプ用の落下アニメーションの再生が始まり、
      普通に高い所から落下した場合は通常の落下アニメーションの再生になります。

      実際の動画はこんな感じになりました。

      急造で作ったのでちゃんと動作するかは不明です。(^_^;)

      ジャンプ後の落下はジャンプ状態から自然と遷移するようにするだけでジャンプからしかいかない落下アニメーションに遷移させる事が出来ます。

      スクリプトでジャンプ機能を実装している場合はジャンプで落下するアニメーションの基点を足元にするといいかもしれません。

      普通に落下する場合はこの記事の内容と同じですね。

      ジャンプからの落下アニメーションと普通に落下のアニメーションを変えてるんですが、もっと違いがわかりやすいアニメーションにしておけばよかったですね・・・。