i-school - 【3D】Rigidbody によるベーシックなジャンプ機能の実装例
 3Dゲームであれば、FPS や TPS など問わずに活用できる実装例です。




サンプルコード


 最も一般的な実装例です。
Rigidbody コンポーネントの機能を利用してジャンプしています。


PlayerJump.cs

 <= クリックすると開きます



<FPS の場合>


 FPS などの場合には、プレイヤーが傾いていると上方向へのジャンプが正常に動作しない恐れがありますので、
別途制御をおこなうようにしてください。

 例えば、以下のような処理を書き加えたりすることで制御できます。

    private void FixedUpdate() {
        if (rb.velocity.y > 25.0f) {
            rb.velocity = new Vector3(rb.velocity.x, 25.0f, rb.velocity.z);
        }
    }


<改善案 ー落下速度についてー>


 ジャンプ後の落下速度が緩やかで、ふわっとした落下になってしまうことがあります。

 そういった場合には、2Dであれば Mass の値を増やして質量を増やしたり、 GravityScale の値を増やして重力を増加させてみましょう。
ジャンプする力にも影響するため、ジャンプの高さとの調整が必要になります。

 3Dの場合には Mass しか設定できませんが、Rigidbody の Velocity の値を Y 軸に適用することで落下の値に重力を反映できます。


デバッグモードの実装例


 先ほどのサンプルコードを修正して、Physics.Raycast メソッドによる Ray を可視化する処理を追加してみましょう。

 新しい変数の宣言、および、Update メソッド内処理を追加しています。

 変数については同じ種類の修飾子でまとめておくと読みやすさが増します。
そのため、いままで用意されていた変数と変数の間に新しい変数を追加して、同じ修飾子同士でまとまるように書いています。


PlayerJump.cs

 <= クリックすると開きます



<Debug.DrawRay メソッドの実行タイミングの制御方法>


 Debug.DrawRay メソッドは、Scene ビューにて Ray を可視化するためのメソッドです。

 抜粋します。

    public bool isDebugModeRayOn; // デバッグモードとして、Rayを表示するかどうかを制御するためのスイッチ


    private void Update()
    {        
        // Ray のデバッグモードがオフなら、ここで処理終了
        if(!isDebugModeRayOn){
            return;
        }

        // Ray の可視化(デバッグ用)
        Debug.DrawRay(transform.position, Vector3.down * groundCheckDistance, Color.red);
    }

 Update メソッド内に直接 Debug.DrawRay メソッドを書いてしまうと、ゲーム実行中では常に処理が動くことになり、処理負荷が増大します。

 そのため今回は、Debug.DrawRay メソッドを利用するかどうかを設定するためのスイッチ役の変数を作成し、
それを切り替えることで Debug.DrawRay メソッドの実行タイミングを制御し、必要な時だけ可視化できるような状態を作り出しています。

 このように、デバッグモードについても、自作することが可能です。
必要な機能に応じて検討し、実際に作って動かしてみましょう。