Unity

【Unity】地面の上にいるときだけジャンプする方法

本記事内には、アフィリエイトリンクを含む場合があります

Unity入門#1の記事でも使用した
地面を検知した時だけ、
ジャンプができるようにする方法について、解説します。

”地面を検知した時だけ”という条件を実装しなければ、
空中ジャンプができてしまい、舞空術ありアクションゲームと化してしまいます^^;

なので、正常なアクションゲームを作りたい場合、
この条件設定は必須と言ってよいでしょう。

まずは、それを実装するためのコードです。

    bool isGrounded;
    
    void Update()
    {
        isGrounded = CheckGround();
        if (Input.GetKeyDown(KeyCode.Space))
        {
            if(isGrounded)
            {
                isGrounded = false;
                rb.AddForce(Vector3.up * jumpSpeed, ForceMode.Impulse);
            }
        }
    }

    bool CheckGround()
    {
        var ray = new Ray(transform.position + Vector3.up * 0.01f, Vector3.down);
        var distance = 1.5f;
        return Physics.Raycast(ray, distance);
    }

Update関数にジャンプのコードを書くことで、
ジャンプのためのSpaceキー入力をいつでも検出して、処理するようになっています。

その直前に、必ずCheckGround()という関数が
「isGround 」=となっています。

これは、CheckGroundという関数で返された値(戻り値)をisGroundedに代入するということです。

isGroundedの種別はboolであり、trueまたはfalseをとる変数です。

そして、もちろんCheckGround関数もbool CheckGroundとし、
trueかfalseを返す関数とします。

Spaceキーを押しても、CheckGroundがtrueでなければ、
そのif文の中身が読まれないので、空中ではジャンプができないようになるのです。

ちなみに、boolの値でif文を作る場合、
if(isGrounded) は、if(isGrouded == true)と同意で
if(!isGrounded) は、if(isGrounded == false)と同意となります。

 

 

それでは気になる、肝心のCheckGround関数を見てみましょう。

Rayは光線です。
2Dの画面スワイプゲームの作り方でも出てきましたね^^

var rayを宣言し、まず基本的な定義を行います。
開始地点として、オブジェクトの0.01f真上の地点に、
光線を飛ばす方向を、Vector3.down、つまり真下方向にしています。

さらに、var distanceを宣言し、光線を飛ばしたときに、衝突を検出する範囲(距離)1.5fと定義してます。

returnの後には、何の結果(bool)を返すかを記述するのですが、
ここで初めて、光線の衝突を判定するPhysics.Raycastを用います。
宣言してきたrayとdistanceを引数に入れて、判定させます。

オブジェクトの真下方向に、距離1.5fの範囲で、
衝突するものがあるかどうか、trueまたはfalseで判定します。

 

このようにisGroundedにその結果を返す仕組みです。

なお、CheckGrounded関数の戻り値が代入されるまで、
次のコードが読み進まれないことも理解しておきましょう。

以上、地面の上にいるときのジャンプとその仕組みの説明でした!!

ABOUT ME
いなも@システマライフハッカー
”仙豆”を開発することを夢見て、健康食品会社で働いていたものの、2016年に出会ったロシアの武術”システマ”こそ、その糸口があると感銘し、勝手にシステマ普及活動を始める。 一方で、クリエイティブなモノ作りが好きで、DX社会で楽しみを見出せる"Unity”を活かして、”スマートかつ快適な暮らし”のヒントを発信している。

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA