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

記事内に広告が含まれています。

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

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

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

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

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

スポンサーリンク

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

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

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

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

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

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

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

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

Prototypingについては

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

を参照してください。

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

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

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

キャラクターの作成

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

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

を参照してください。

(注)

スクリプトで人型のボーンを取得し、そこからレイを飛ばして地面を確認するので、キャラクターモデルのインスペクタでRigのAnimation TypeをHumanoidにしておく必要があります。

人型以外でも例を飛ばす位置をHumanBodyBonesからレイを飛ばすのではなく空のゲームオブジェクトを作ってそこからレイを飛ばしたり、キャラクターの基点からオフセット値を加えた位置からレイを飛ばしても同じように出来ます。

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

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

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に取り込んだアニメーションの一部を切り取って使う
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から下にレイを飛ばし、地面に接触したら着地アニメーションへと遷移させています。

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

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

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

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

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

↑のようになりました。

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

タイトルとURLをコピーしました