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

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

ジャンプ機能については

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段階ジャンプ機能を取りつけたDoubleJumpCharaスクリプトの作成

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

少しづつ見ていきます。

を宣言します。

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

isDoubleJumpは2段階ジャンプ中かどうかのフラグです。

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

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

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

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

アニメーションがジャンプ前の状態の時、またはJumpアニメーションで0.5以下の場合だけ2段階目のジャンプが出来るようにします。

Jump状態への遷移前のnormalizeTimeが入って来る時もあるのでこの条件を入れています。

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

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

Y軸の値は重力加速度をそのまま設定します。

1段階目のジャンプ中も2段階目のジャンプ中もジャンプ中に前後左右に動けるようにしてます。

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

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

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

DoubleJumpCharaスクリプトのインスペクタ

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

そういった時は

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

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

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

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

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

↑が連続ジャンプと方向転換の実行結果です。

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

スポンサーリンク

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

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