バッテラが如く

プログラミングしましょ!

【Unity】ジャンプ中にジャンプができないように接地判定してみる (Collision編)

この記事の情報は次のバージョンで動作確認しています。

  • MacOS Monterey (12.1)
  • Unity (2021.3.2f1)
  • Unity

    はじめに

    どうも、バッテラです。

    前回キャラクターをジャンプさせるという記事を書きました。

    https://www.m2game.net/entry/2022/09/1 4/062839www.m2game.net

    しかしジャンプはできたのですが、このようにジャンプ中にジャンプができてしまう問題が起きてしまいました。

    まぁ制御していないので当たり前なんですけどねー。

    ということでジャンプをしたら地面に着くまではジャンプできないような制御を実装したいと思います!

    接地判定のロジック(考え方)

    キャラが地面に立ってるのはRigidbodyとColliderで衝突してるからで、衝突している(接地) = ジャンプ可能という考えのもとで衝突判定を実装していけばいいことのなります。

    ということで衝突判定を実装していきます。

    床にタグをつける (エディタ)

    床のゲームオブジェクトにTag(タグ)をつけます。これはスクリプト側で使うためなので名称はなんでもいいです、Floorとかにしておきます。

    (追記)Layerでもいいかも。区別できればなんでもOK!

    接地判定処理を実装 (スクリプト)

    最初に接地状態の情報を持つ変数を1個用意しておきます。

    bool isGround = false;
    

    次は接触したかを判別するプログラムを作ります。

    もしプレイヤーが何かに衝突した時はOnCollisionEnterが呼ばれるので、タグで絞り込めば床に接地したかを判断できます。コードはこんな感じ。

    void OnCollisionEnter(Collision collision)
    {
        if (collision.gameObject.tag == "Floor")
        {
            isGround = true;
        }
    }
    

    次は離れたかを判別するプログラムを作ります。

    プレイヤーが衝突してる状態から離れた場合はOnCollisionExitが呼ばれます。

    void OnCollisionExit(Collision collision)
    {
        if (collision.gameObject.tag == "Floor")
        {
            isGround = false;
        }
    }
    

    あとはisGroundを見てジャンプさせるかの処理を書けば完成です。

    // Spaceキー押下でジャンプするコードのサンプルです
    
    void Update()
    {
        if (isGround && Input.GetKeyDown(KeyCode.Space))
        {
            GetComponent<Rigidbody>().AddForce(transform.up * power, ForceMode.Impulse);
        }
    }
    

    これで実行すると連打してもこのように接地しないとジャンプできないように制御できました!

    おしまい。