Unityのキャラクターでジャンプアップから着地までのアニメーションを変更する

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

今回はCharacterControllerコンポーネントを使った人型キャラクターで、ジャンプボタンを押した時にジャンプをさせ、ジャンプアップ→空中→着地までのアニメーションの変化をさせていきたいと思います。

この機能は『シンプルなアクションゲームを作ってみよう』のカテゴリのジャンプの機能で作りましたが、そちらはRigidbody+コライダで作ったキャラクターのRigidbodyのvelocityを操作する事で行いました。

シンプルなアクションゲームを作ってみよう19-ジャンプ機能を作成する-
シンプルなアクションゲームのプレイヤーにジャンプ機能を取り付けていきます。また二段階のジャンプも出来るようにします。

今回はCharacterControllerコンポーネントを使ったキャラクターで同様の機能を作成していきます。

今回の機能を作成すると以下のようにキャラクターがジャンプし、接地するまでその位置に応じてアニメーションが変化します。

スポンサーリンク

キャラクターの設定

キャラクターモデルをヒエラルキーに配置し、インスペクタのAdd ComponentからCharacterControllerコンポーネントの取り付けを行います。

キャラクターモデルに合わせてコライダのサイズを調整してください。

AnimatorControllerの作成

次にAssetsフォルダで右クリックからCreate→Animator Controllerを選択し、名前をJumpCharacterとします。

JumpCharacterアニメーターコントローラーではアニメーションパラメータにFloat型のSpeed、Trigger型のJump、Float型のJumpPower、Bool型のIsGroudedを作成します。

ジャンプキャラクターのアニメーションパラメーター

次に状態としてIdle、Walkを作成し各状態を選択した状態で右クリックからMake Transitionを選択し、Idle→Walk、Walk→Idleの遷移を作成します。

Idle→WalkのConditionsの条件はSpeedがGreaterで0.1にし、Has Exit Timeのチェックを外し、SettingsのInterruption SourceをNext Stateにします。
Walk→Idleの条件はSpeedがLessで0.1にし、Has Exit Timeのチェックを外し、SettingsのInterruption SourceをNext Stateにします。

次にアニメーターウインドウ内で右クリックからCreate State→From New Blend Treeを選択し、インスペクタでBlend Treeの部分をJumpと変更します。

ジャンプキャラクターのJumpブレンドツリー

Idle→Jump、Walk→Jump、Jump→Idleへの遷移を作成します。

Idle→JumpはConditionsにJumpを設定し、Has Exit Timeのチェックを外します。
Walk→JumpはJumpを設定し、Has Exit Timeのチェックを外します。
Jump→IdleはIsGroundedがtrueを設定し、Has Exit Timeのチェックを外し、SettingsのInterruption SourceをNext Stateにします。

ジャンプキャラクターのBase Layerの状態と遷移

次はJumpブレンドツリーの中身を作成していきます。

Jumpブレンドツリーをダブルクリックします。

Blend Treeを選択し、インスペクタのMotionで+を押しAdd Motion Fieldを選択して、3つのモーションを設定出来るようにします。

また3つのモーションを切り替えるのに使用するのはJumpPowerアニメーションパラメーターなので設定しておきます。

ジャンプブレンドツリーで3つのモーションを設定出来るようにする

3つのモーションにはUnityのスタンダードアセット(アセットストアからダウンロード&インポートしてください)にあるHumanoidFall、HumanoidMidAir、HumanoidJumpUpアニメーションを設定します。

アニメーションパラメーターのJumpPowerに値に応じてこの3つのモーションをブレンドするのでThresholdにしきい値を設定します。

ジャンプブレンドツリーでのモーションのしきい値設定

JumpPowerの値はジャンプした直後に最大値、最高点で0、ジャンプから落下でマイナスの値を入れていきます。

ジャンプアニメーションのブレンド

上のような感じです。

なのでジャンプ直後はHumanoidJumpUpアニメーションに近く、最高到達点ではHumanoidMidAirに近く、落下から着地まではHumanoidFallアニメーションに近いものがブレンドさせ再生されます。

今回の場合は-5、0、5という値を設定していますが、これはスクリプトからアニメーションパラメーターのJumpPowerに送る値に応じて変更する必要が出てきます。

これでアニメーターコントローラーが出来ました。

ヒエラルキーのキャラクターを選択し、インスペクタのAnimatorにJumpCharacterアニメーターコントローラーを設定します。

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

キャラクターのアニメーターコントローラーが出来たので、次はキャラクターを操作するスクリプトの作成を行います。

新しくJumpCharacterという名前のスクリプトを作成し、キャラクターに取り付けます。

jumpPowerはインスペクタで設定出来るようにしています。

currentJumpValueはJumpPowerアニメーションパラメーターに送る値です。

doubleJumpPowerは二段階目のジャンプをする時の力です。

isFirstJumpは最初のジャンプをしている最中かどうかです。SerializeFieldアトリビュートが付いているのはUnity実行中に確認するためで、付けなくてもいいです。

Startメソッドで自身からCharacterControllerとAnimatorコンポーネントを取得します。

Updateメソッドでは最初にinputに移動値を入れます。

キャラクターが接地している場合はvelocityにVector3.downを入れます。

これは接地と判断した時に地面とすぐに離れて接地していないとすぐ判定されるのを避ける為に下向きの速度を足しておきます(坂を下る時とかにジャンプが出来ない現象が発生するのを避ける為)。

アニメーションパラメーターのIsGroundedにtrueを入れます。

ジャンプボタンを押したらisFirstJumpをtrueにし、currentJumpValueにjumpPowerを入れます。

さらにvelocityのyにjumpPowerを入れます。

アニメーションパラメーターのJumpをトリガーし、IsGroundedをfalseにします。

キャラクターが接地していない時でisFirstJumpがtrue(1回目のジャンプ中)でジャンプボタンを押した時はisFirstJumpをfalseにし、currentJumpValueにdoubleJumpPowerを入れます。

velocityのyにdoubleJumpPowerを入れます。

アニメーションパラメーターのJumpは既に1回目のジャンプ中なのでトリガーしません。

移動キーを押していればキャラクターの向きをそちらに向けます。

速度にはキャラクターの向いている向きにspeedをかけ、さらにY方向の速度を足した値にします。

これはジャンプ中もキャラクターが左右と奥と手前に移動可とする為の処理で、移動と落下を別に計算し、それを足しています。

アニメーションパラメーターのSpeedにinput.magnitude(ベクトルの長さ)を入れます。

入力値がなければSpeedには0を入れます。

アニメーションパラメーターのJumpPowerに渡す値はジャンプ直後は最大値で時間と共に減らしていく必要があります。

そこでcurrentJumpPowerがマイナスのjumpPowerより大きい時はcurrentJumpPowerを減らしていきます。

減らす値は重力加速度です。

計算した値をアニメーションパラメーターのJumpPowerに渡しています。

今回はフィールドのJumpPowerは6に設定しているので、ジャンプ直後はcurrentJumpValueは6になり、そこからマイナスのJumpPowerである-6より下になるまで-9.81×Time.deltaTimeを足して減らしていきます。

最後に重力値をvelocityのyに足し、最後にCharacterControllerのMoveメソッドを使ってキャラクターを移動させています。

これで機能が出来ました。

キャラクターのインスペクタは以下のような感じになっています。

ジャンプキャラクターのインスペクタ

終わりに

今回の記事は『シンプルなアクションゲームを作ってみよう』カテゴリで作ったジャンプ機能をCharacterControllerコンポーネントに置き換えただけです。

多少スクリプトが変わっているかもしれませんが・・・・。

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