【Unity】矩形と円形の接触判定

矩形と円形の接触判定を行いたい事案があったのでメモ.

実装

矩形の表現には Rect 型を使用します.
Circle型は無いので以下のように定義しました.

record Circle(Vector2 Center, float Radius);

矩形と円形が接触しているかは以下の3ステップで判定可能.

  • 矩形の返上で最も円の中心に近い座標を求める
  • 求めた座標と円の中心の距離を求める
  • 求めた距離と円の半径を比較する
static bool IsOverlap(Rect rect, Circle circle)
{
    // 矩形の返上で最も円の中心に近い座標を求める
    var x = Mathf.Max(rect.xMin, Mathf.Min(rect.xMax, circle.Center.x));
    var y = Mathf.Max(rect.yMin, Mathf.Min(rect.yMax, circle.Center.y));
    // 求めた座標と円の中心の距離を求める
    var sqrDistance = (new Vector2(x, y) - circle.Center).sqrMagnitude;
    // 求めた距離と円の半径を比較する
    return sqrDistance <= Mathf.Pow(circle.Radius, 2.0f);
}

補足

// 求めた座標と円の中心の距離を求める
var sqrDistance = (new Vector2(x, y) - circle.Center).sqrMagnitude;

距離の算出に Vector2.Distance を使用すると
内部で Math.Sqrt が使用される為, sqrMagnitude を使用しています.