Unityでキャラクターがジャンプ出来るようにする

今回はキャラクターをジャンプさせる機能を搭載してみます。
すでに80記事以上書いていて今になってやっとジャンプ機能か、という感じですが・・・。

キャラクターを移動させる処理であったり、重力の処理がいまいちうまくいっておらず手を付けていませんでした。
そこら辺の処理が出来てきたので、今回ジャンプする機能をやってみました。

重力に関する記事は

Unityで間違った重力の計算をしているかも!?
Unityのキャラクター等に重力を働かせる事は多いですが、重力を働かせる処理が実は間違っているかもしれません。

を参考にしてください。

上の重力処理を間違えているとジャンプ機能がうまく出来ません。

スポンサーリンク

ジャンプ機能をキャラクター移動スクリプトに追加する

まずはキャラクター移動スクリプトMoveTestを作成します。
以前の記事で作成したMoveTestを修正して使用する事も出来ます。

以下がMoveTestスクリプトです。

地面に接地している時に方向キーで縦横の動きの処理を入れますが、その後に

Input.GetButtonDown(“Jump”)

でJumpに設定されているキーを押した時にジャンプさせる処理を入れます。
デフォルトではSPACEキーがJumpに設定されているので、SPACEキーを押すとジャンプするようになります。

キーの設定はUnityのメニューでEdit→Project Settings→Inputで設定されているキーの確認と変更が出来ます。

スクリプトではvelocity.yの値にjumpPowerを足して上方向に移動値を加えます。
jumpPowerはpublicで宣言しているので、インスペクタ上で値を設定出来ます。

ジャンプキーを検知するのはcCon.isGroundedが真の時、つまり地面に接地している時に行います。
それ以外の所でジャンプキーの検知をすればジャンプ中にさらにジャンプさせ2段ジャンプの機能も作れると思いますが、重力値の計算との兼ね合いで混乱する可能性があります。

これでSPACEキーを押せばキャラクターがジャンプするようになります。

Unityの実行ボタンを押して確認してみてください。

jump1

立っている時と移動している時にSPACEキーを押すとキャラクターがジャンプします。
移動中にジャンプキー押せば縦横の移動をしながらジャンプするのがわかると思います。

ジャンプ中はジャンプ用アニメーションを再生する

ここまでの機能だとジャンプ中のアニメーションはその時のアニメーションを再生している状態です。
そこでジャンプ中はジャンプのアニメーションを再生するように変更します。

jump2

上のようにJump状態とアニメーションパラメータにJumpをBool型で作成します。

jump3

Idle→JumpへはJumpがtrueになった時に遷移するようにします。
JumpのアニメーションクリップにはStandard AssetのJumpを設定します。
このJumpは助走が入っているので23%左に移動させ、助走部分が入らないようにします。

jump4

Jump→Idleへの遷移はHas Exit Timeのチェックを入れ、条件にJumpがfalseの時を設定します。
これでJumpがfalseになってもジャンプアニメーションを最後まで再生するようになります。

着地後にすぐ別のアニメーションに遷移させたい場合はHas Exit Timeのチェックを外し、スクリプトで着地後すぐアニメーションパラメータのJumpをfalseにします。

ジャンプアニメーションへ遷移させる処理をスクリプトに追加

これでアニメーターコントローラの設定が終わったのでMoveTestスクリプトにアニメーション操作の処理を加えます。

ジャンプキーが押された時に

animator.SetBool(“Jump”, true);

でアニメーションを遷移させます。
条件に
!animator.GetCurrentAnimatorStateInfo(0).IsName(“Jump”)

を追加していますが、これは現在ジャンプアニメーションを再生中でない時という意味で、
着地後もジャンプアニメーションが再生されているので、それが終わるまでは再度ジャンプしないようにします。

キャラクターの移動処理の部分にも同じ処理が追加されていますが、
着地後のジャンプアニメーション中にキャラが移動しないようにする為です。

着地後にすぐジャンプアニメーションをやめ移動できるようにする場合はこの条件はいりません。

これでスクリプトの編集が終わりました。

しかし、このままだとアニメーションパラメータのJumpがfalseになる事がないので、
ジャンプのアニメーションの最後で止まってしまいます。

せっかくなので以前に作成した記事

UnityアニメーターコントローラのBehaviourでアニメを制御する
Unityアニメーターコントローラを通常のスクリプトで制御するのではなくBehaviourを使って制御するようにします

を使って
アニメーションパラメータを操作してみます。

Behaviourを使ってアニメーションパラメータを操作する

jump5

アニメーターコントローラーのJumpの状態を選択し、インスペクタでAdd Behaviourをクリックし新しいスクリプトEndJumpを作成します。

現在の所、ビヘイビアはC#でしか作れないみたい?

ビヘイビアを作成するとデフォルトで以下のような記述がされています。

今回はJumpに遷移後にアニメーションパラメータのJumpをfalseにしたいので、
OnStateEnterのコメント化されている部分を削除し、中に

animator.SetBool(“Jump”, false);

という処理を追加します。

これでJump状態に遷移してすぐにアニメーションパラメータのJumpがfalseになります。

これでジャンプ機能が完成しました。
Unityの実行ボタンを押して確認してみましょう。

jump7

今回はジャンプのアニメーションが終了するまで操作不可にしてますが、
前述したとおり、着地と同時にアニメーション遷移や移動させる事も可能なので、そこら辺は好みに応じてスクリプトを組んでいくといいと思います。

坂のような場所を下っている時にCharacterControllerのIsGroundedがfalseになり、ジャンプが出来ない事があります。

そんな時は

UnityのCharacterControllerの接地が判断出来ない時にスクリプトを使う
UnityのキャラクターをCharacterControllerで動かしている場合に地面とキャラクター(厳密にはコライダ)が接地しているかどうかはIsGroundedプロパティで判断していますが、坂を下っている時はこの値がfalseになっています。そんな時にスクリプトで接地を判断してみます。

を参照してください。
下り坂やデコボコな道でIsGroundedで接地を判断出来ない時にもスクリプトで設置を判断しジャンプさせる事が出来るようになります。

また2段階ジャンプをさせたい場合は

Unityのゲームで2段階ジャンプの機能を作成する
Unityのアクションゲームで2段階ジャンプの機能を作成します。ジャンプ中にジャンプキーが押されたらそこからさらにジャンプ出来るようにします。

↑も参考にしてください。

ジャンプ中に移動キーで移動させる

ツイッターで質問を頂きましたので、ジャンプ中に移動キーを押した時にキャラクターを移動させる方法を追記します。

ここまでのジャンプ機能ではジャンプ中は操作できないような仕様にしていたのでジャンプ中は移動キーを押してもキャラクターは空中で移動出来ませんでした。

しかしジャンプ中もキャラクターを動かしたい場合もあると思います。

そんな時はキャラクターが地面に接地中に移動値を取得するという条件を外してしまいましょう。

接地した時はvelocityの値を初期化するだけにして、Update関数内で移動値は常に取得するようにします。

また移動値はX方向とZ方向のvelocityを別に代入するようにします。

今までは接地している時だけvelocityに値を足すという形にしていましたが、そのまま足すという処理のままだとジャンプ中の移動でものすごく速い移動をしてしまいます。

なので重力値であるvelocity.zの値を書き換えず個別に値を代入しています。

またジャンプ中にジャンプキーを押すとたまにジャンプしてしまう不具合が発生したので

!animator.IsInTransition(0)

というアニメーションが遷移途中でないという条件を加えました。

これでジャンプ中の移動が出来るようになったので試してみましょう。

ジャンプ中に移動出来るサンプル

↑のようにジャンプ中に移動キーを押すと移動出来るようになりました。