Unity|接地の判定をBoxCastで行う(プレイヤーが地面に着いているか)

Unity2Dで「プレイヤー(キャラクター)が地面に着地しているか」をBoxCastを利用して判定してみます。

はじめに

下記にて、「raycastで接地判定する」を書きました。

raycastの場合、線で判定を行うので下記のような感じの場合、接地していないと判定されてしまいます。これを解消するためにBoxCastを利用してみます。

途中までは同じ進行です。

実装開始

「2DObject」→「Sprites」→「Square」を2つ追加。名前を「Player」と「Ground」とします。

Playerオブジェクトは位置を変更して、「BoxCollider2D」と「Rigidbody2D」の2つをアタッチします。

GroundオブジェクトはBoxCollider2Dをアタッチ、位置、スケールに加え、色も変更しておきます。Layerに「ground」をセット。

ゲーム画面は下記のようになります。

このまま実行すると転がってしまうので、Playerの「Rigidbody2D」でZ軸を固定します。

スクリプトの作成

下記スクリプトを作成します。スペースキーでジャンプしますが、その際、地面と接地しているか判定しています。

using UnityEngine;

public class PlayerJump : MonoBehaviour
{
    [SerializeField] private LayerMask groundLayer;
    private float jumpPower = 5.0f;
    private Rigidbody2D _rb;

    void Start()
    {
        _rb = GetComponent<Rigidbody2D>();
    }

    void Update()
    {
        if (Input.GetKey(KeyCode.Space) && isGrounded())
            _rb.velocity = new Vector2(_rb.velocity.x, jumpPower);
    }

    private bool isGrounded()
    {
        RaycastHit2D hit = Physics2D.BoxCast
            (transform.position, Vector2.one, 0f, Vector2.down, 0.1f, groundLayer);

        return hit.collider != null;
    }
}

Playerオブジェクトにスクリプトをアタッチして、レイヤーのパラメータをセットします。

実行すると下記のような感じに、端の方でもジャンプすることができます。

レイのイメージは下記のような感じの赤い枠になります。

公式リファレンスは下記です。

BoxCastのほかに、CapsuleCastやCircleCastもあります。状況によって使い分ける感じですね。

タイトルとURLをコピーしました