パープルハット

※当サイトではGoogleアドセンス広告を利用しています

Unity 2Dでの当たり判定(OverlapBox)



Physics2D.OverlapBoxについて

概要

  • 指定した四角形の範囲内にある重なっているBoxCollider2Dなどを検出することで、衝突判定を行う。
  • 円形の当たり判定を行いたい場合は、Physics2D.OverlapCircle(外部リンク)などを使用してください。
  • OnCollisionStay2Dなどと異なり、任意のタイミングで呼び出せる



使用する関数の説明

Physics2D.OverlapBox(Vector2 point, Vector2 size, float angle, [int layerMask])

戻り値 Collider2D
point 衝突判定の四角形の中心座標
size 四角形の大きさ
angle 傾き
layerMask 衝突判定するLayerの指定(指定しない場合は、すべてのLayerとの衝突を検知)




使用例

準備

以降の例で使用するオブジェクトを示します。

  • BoxCollider2Dは初期設定のままです。
  • 「Black」のLayerの設定を忘れないように
  • 「Star」にアタッチされている「TestController.cs」はキーボードからの入力で移動できるようにするためのもので、次のプログラムが記載されています。

オブジェクトの設定

using UnityEngine;

public class TestController : MonoBehaviour
{
    [SerializeField] float moveSpeed;

    private void Update()
    {
        if (Input.GetKey(KeyCode.RightArrow))
        {
            gameObject.transform.Translate(Vector2.right * moveSpeed * Time.deltaTime, Space.World);
        }
        else if (Input.GetKey(KeyCode.LeftArrow))
        {
            gameObject.transform.Translate(Vector2.left * moveSpeed * Time.deltaTime, Space.World);
        }
        else if (Input.GetKey(KeyCode.DownArrow))
        {
            gameObject.transform.Translate(Vector2.down * moveSpeed * Time.deltaTime, Space.World);
        }
        else if (Input.GetKey(KeyCode.UpArrow))
        {
            gameObject.transform.Translate(Vector2.up * moveSpeed * Time.deltaTime, Space.World);
        }
    }
}




①LayerMaskの指定なし

  • 引数のLayerMaskを省略した場合の使用方法です。
  • 先ほど用意した「Star」に以下のスクリプトをアタッチして設定を行います。


ソースコード

  • 関数「DrawOverlapBox」によりゲーム実行中にシーンビュー上でOverlapBoxの四角形が描画されます。
  • 検知している間は四角形が「overlapColor」の色に、そうでない場合は「defaultColor」で指定した色になります。

using UnityEngine;

public class OverlapBoxTest : MonoBehaviour
{
    [SerializeField] Vector2 size;
    [SerializeField] Color defaultColor;
    [SerializeField] Color overlapColor;

    void Update()
    {
        // 衝突検知
        Collider2D col = Physics2D.OverlapBox(gameObject.transform.position, size, 0f);

        // 衝突している場合
        if (col)
        {
            DrawOverlapBox(gameObject.transform.position, size, overlapColor);
        }
        else
        {
            DrawOverlapBox(gameObject.transform.position, size, defaultColor);
        }
    }
    // デバック用
    void DrawOverlapBox(Vector2 point, Vector2 size, Color color)
    {
        //4つの頂点の位置を取得
        Vector2 rightUp = new Vector2(point.x + size.x / 2, point.y + size.y / 2);//右上
        Vector2 leftUp = new Vector2(point.x - size.x / 2, point.y + size.y / 2);//左上
        Vector2 leftDown = new Vector2(point.x - size.x / 2, point.y - size.y / 2);//左下
        Vector2 rightDown = new Vector2(point.x + size.x / 2, point.y - size.y / 2);//右下
            
        //描画
        Debug.DrawLine(rightUp, leftUp, color);
        Debug.DrawLine(leftUp, leftDown, color);
        Debug.DrawLine(leftDown, rightDown, color);
        Debug.DrawLine(rightDown, rightUp, color);
    }
}


設定

OverlapBoxTestのアタッチ

実行結果

LayerMask未指定の場合の処理


②LayerMaskの指定あり

  • 引数のLayerMaskを指定した場合の使用方法です。
  • 先ほど用意した「OverlapBoxTest」を以下のように書き換えます。

using UnityEngine;

public class OverlapBoxTest : MonoBehaviour
{
    //変更箇所1
    [SerializeField] LayerMask blackLayer;

    [SerializeField] Vector2 size;
    [SerializeField] Color defaultColor;
    [SerializeField] Color overlapColor;

    void Update()
    {
        //変更箇所2
        Collider2D col = Physics2D.OverlapBox(gameObject.transform.position, size, 0f, blackLayer);


        if (col)
        {
            DrawOverlapBox(gameObject.transform.position, size, overlapColor);
        }
        else
        {
            DrawOverlapBox(gameObject.transform.position, size, defaultColor);
        }
    }

    void DrawOverlapBox(Vector2 point, Vector2 size, Color color)
    {
        //4つの頂点の位置を取得
        Vector2 rightUp = new Vector2(point.x + size.x / 2, point.y + size.y / 2);//右上
        Vector2 leftUp = new Vector2(point.x - size.x / 2, point.y + size.y / 2);//左上
        Vector2 leftDown = new Vector2(point.x - size.x / 2, point.y - size.y / 2);//左下
        Vector2 rightDown = new Vector2(point.x + size.x / 2, point.y - size.y / 2);//右下

        //描画
        Debug.DrawLine(rightUp, leftUp, color);
        Debug.DrawLine(leftUp, leftDown, color);
        Debug.DrawLine(leftDown, rightDown, color);
        Debug.DrawLine(rightDown, rightUp, color);
    }
}


設定

BlackLayerの指定

実行結果

LayerBox指定の場合の実行結果