Unityのゲームで2段階ジャンプの機能を作成する

今回はジャンプしている最中に再度ジャンプキーを押した時に2段階ジャンプが出来るようにします。

ジャンプ機能については

Unityでキャラクターがジャンプ出来るようにする
Unityのゲームでキャラクターがジャンプ出来るようにする機能を作成します。

を参考にしてください。

またジャンプ中にコライダのサイズを変更する場合は

Unityのキャラクターコライダのサイズをアニメーションに応じて調整する
Unityで使う当たり判定(コライダ)のサイズをアニメーションに応じて変更し、ジャンプ中のキャラクターのコライダのサイズを変更し狭い空間を通過出来るようにしてみます。

を参考にしてください。

スポンサーリンク

2段階ジャンプの機能をどうやって作るか?

今回作成する2段階ジャンプの機能を考えていきましょう。

まずは通常のジャンプを考えます。

ジャンプキーを押したらジャンプアニメーションをさせ、キャラクターの上向きにジャンプ力を足します。

キャラクターには重力を働かせているので数秒後には落下して地面に接地します。

地面に接地したら重力値を0にしています。

それでは2段階ジャンプについて考えましょう。

2段階ジャンプなので、まずはジャンプしている必要があります。

ジャンプ中にジャンプキーを押したらキャラクターの上向きに2段階目のジャンプ力を足します。

ジャンプ中いつでも2段階目のジャンプが出来ると地面スレスレで再度ジャンプするという事が出来てしまいます。

そういう風に作りたい場合はいいんですが、今回の場合はジャンプのアニメーションの再生位置が最初の方の時だけ2段階目のジャンプが出来るようにしておきます。

アニメーターでもJump状態からDoubleJump状態へと遷移させるようにします。

ジャンプの1段階目、2段階目に関係なく重力でキャラクターは落下し、地面に接地します。

もし2段階目のジャンプをスレスレで出来るようにするとなると重力の事もあるので難しくなります。

2段階目のジャンプ力が重力加速度分の落下力より高くないと一瞬止まるだけのようにしか見えないからです。

アニメーターに2段階目のジャンプの状態と遷移を作成する

それではまずアニメーターでDoubleJumpの状態の作成と遷移を作成していきましょう。

DoubleJump状態と遷移を作成する

↑のようにDoubleJump状態を作成します。

DoubleJumpのアニメーションクリップにはJumpと同じアニメーションを設定しました。

Jump→DoubleJump、DoubleJump→Idleへと遷移を繋げます。

EndJumpビヘイビアではJumpをfalseにしない

EndJumpビヘイビアを使用するのをやめて別の制御を行う

先ほど紹介した記事でジャンプ機能を作成した方はJump状態にEndJumpビヘイビアを設定しアニメーションパラメータのJumpをfalseにしていました。

今回の2段階ジャンプ機能搭載の際にここでJumpをfalseにするとスクリプトの制御が難しくなるので、この機能はオフにしておきます。

↑のようにコメント化するかEndJump自体を外してください。

DoubleJumpへの遷移条件を設定する

では次にアニメーションパラメータにDoubleJumpを作成します。

Jump→DoubleJumpへの遷移条件にDoubleJumpがtrueの時を設定します。

Jump→DoubleJumpへの遷移条件

↑が遷移条件になります。

Has Exit Timeのチェックを外し、DoubleJumpを左に32%動かして最初の方のアニメーションを再生させないようにします。

これはStandardAssetのJumpを使用している場合に助走があるのでカットしています。

他のアニメーションクリップを使用している場合はそれぞれアニメーションの助走部分をカットするか、もしくは必要ありません。

DoubleJump→Idleへの遷移条件

DoubleJump→Idleへの遷移条件は↑のようにします。

アニメーションパラメータのDoubleJumpがfalseになったらIdle状態へ遷移させます。

2段階ジャンプ機能を取りつけたDoubleJumpMoveスクリプトの作成

これでアニメーターの設定が終了したので、キャラクターに移動とジャンプ機能、2段階ジャンプ機能を取りつけたDoubleJumpMoveを作成します。

public var doubleJumpPower : float;
private var input : Vector3; // 入力値
private var doubleJump : boolean; // 2段階ジャンプ中かどうか

を新しく宣言します。

doubleJumpPowerは2段階目のジャンプ力でインスペクタで設定出来るようにします。
doubleJumpは2段階ジャンプ中かどうかのフラグです。

CharacterControllerのisGroundedプロパティで接地が確認された時にアニメーションパラメータのJumpとDoubleJump、doubleJumpをfalseにします。

つまり、地面に着地した時はジャンプ系のパラメータをオフにしています。

接地してない場合で1段階目のジャンプ中の時は

var normalizedTime = Mathf.Repeat(animator.GetCurrentAnimatorStateInfo(0).normalizedTime, 1);

でアニメーターで再生中のアニメーションの再生位置を取得し0~1内で納めます。

それが0.55より下の場合だけ2段階目のジャンプが出来るようにします。

押している方向にキャラクターを向かせて、2段階目のジャンプ力をvelocityのY方向に足します。

2段階ジャンプ中に移動キーで位置を変更出来るようにする場合はキーの入力値を取得してvelocityに値を足します。

2段階ジャンプ中に前の移動値のままにしたい時は

Vector3(x, 0, y)

を使います。

2段階ジャンプ中はずっとこの条件の処理が実行されるので、velocityにそのまま移動キーの値を足すとものすごい勢いで移動してしまうので、Time.deltaTimeをかけ
移動が大きくならないようにしています。

入力値にかけている2の部分を大きくすると移動が大きくなります。

2段階ジャンプ中は移動が可能なので前後左右にいったりきたりという動作が出来てしまいます。

それが嫌な方はさきほど紹介したVector3(x, 0, y)を使った方がいいかもしれません。

移動値に関しては色々試してみてください。

2段階ジャンプが出来るかどうか確認する

これで2段階ジャンプの機能が完成です。

キャラクターにDoubleJumpMoveスクリプトを取りつけインスペクタにパラメータを設定してください。

DoubleJumpMoveスクリプトのインスペクタの設定値

↑のようなパラメータを設定しました。

それではUnityの実行ボタンを押して確認してみましょう。

2段階ジャンプ機能の確認

↑のようになりました。
2段階ジャンプが出来るようになりました!

ジャンプアニメーションの再生位置が0.55以降はジャンプ出来ません。

ジャンプ力を上げるとアニメーション再生位置とジャンプしている高さが合わなくなってくるので調整が必要です。

アニメーションの再生位置で2段階ジャンプが出来るかどうかを判断しないでいつでも2段階ジャンプが出来るようにするのもいいかもしれませんね。

そうなると2段階目のジャンプ力を上げないと重力加速度に負けてしまいますが、

これを過度に上げてしまうと上方向の移動がプラスの時(最初のジャンプで上にあがっている時)に2段階目のジャンプをするとものすごく飛び上がってしまいます。

velocityのyの値によってジャンプ力を変更するとか・・・・うーむ(-.-)
なかなか難しいですね・・・(^_^;)

ジャンプ後すぐに2段階目のジャンプをさせたくない場合は2段階ジャンプのアニメーション再生位置の条件の所に

のように2段階目のジャンプが開始出来る条件も加えるといいかもしれません。

この場合はアニメーションの再生位置で2段階目のジャンプが出来る場所が限定されるようになりますが、

ジャンプ力を大きくしてもアニメーションの再生速度が同じ場合はアニメーションの再生位置で常に2段階目のジャンプがされるので、

ジャンプしている高さで2段階目のジャンプを制御していない事に注意する必要があります。

ジャンプしている高さで制御する場合スクリプトで飛んでいる高さを監視する必要がありますね・・・(^_^;)

でもアニメーションで見て2段階目のジャンプを判断した方がユーザーはキャラクターがどの状態で2段階目のジャンプが出来るかどうかわかるので、

それでいいかもしれません。

それではわたくしはこのへんで・・・・・・・(ToT)/~~~

ジャンプして着地後すぐにジャンプさせたい場合

2段階ジャンプとは関係ないですが、一度ジャンプをして着地したと同時にジャンプキーで再度ジャンプさせたい場合もあるかと思います(連続でジャンプ)。

そういった時は

↑のように状態がJump中でないという条件とアニメーションが遷移途中でないという条件をコメント化するか削除してください。

すると、連続ジャンプが出来ます(試しに連打してみてください)。

ただ、着地と同時にジャンプ出来るので、アニメーションの遷移よりもスクリプトのY座標の値の更新が早い為、歩いている時にキャラクターが浮きあがるという感じになります。

これが気になる人はジャンプ時のアニメーションを使わないようにすると違和感がなくなると思います。

ジャンプ途中で移動キーの方向に飛ばしたい

さきほど連続ジャンプをする事が出来るようになりましたが、再度ジャンプする時に別の方向に飛ばしたい人もいると思います。

そんな時は

↑のように移動キーが押されているかの判定部分のJump中かどうかの条件をコメント化もしくは削除してください。

そうするとジャンプをするときに方向を変えて飛ぶ事が出来るようになります。

連続ジャンプと方向転換のサンプル

↑が連続ジャンプと方向転換の実行結果です。
2段ジャンプ機能はオフにして試しました。

連続でジャンプ出来ていますね!