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); } }
設定
実行結果
②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); } }
設定
実行結果