範囲検出によるコライダー取得(3D & 2D)

1. 資料の目的

物理空間内で「指定範囲に含まれるコライダーを一括取得」する代表的なメソッドを、3D と 2D の両面からまとめた資料です。


2. 3D 空間での範囲検出

2.1. Physics.OverlapSphere

// 指定半径内の全コライダーを取得(全レイヤー・トリガー設定はデフォルト)
Collider[] hits = Physics.OverlapSphere(transform.position, radius);

主な引数

  • position (Vector3):球の中心位置(ワールド座標)
  • radius (float):球の半径
  • layerMask(省略可, int):検出対象レイヤー
  • queryTriggerInteraction(省略可, QueryTriggerInteraction):トリガーを含めるか設定

検出後の処理例

foreach (var hit in hits)
{
    // IDamageable 実装クラスへダメージ
    var dmg = hit.GetComponent<IDamageable>();
    if (dmg != null) dmg.TakeDamage(10);

    // Renderer があれば色を変更
    var rend = hit.GetComponent<Renderer>();
    if (rend != null) rend.material.color = Color.red;
}

2.2. NonAlloc 版による最適化

毎フレーム配列を生成すると GC が発生しやすいため、事前にバッファを用意して結果を詰めます。

// クラス外などで一度だけ確保
private Collider[] buffer = new Collider[16];

void Update()
{
    int count = Physics.OverlapSphereNonAlloc(
        transform.position,
        radius,
        buffer,
        LayerMask.GetMask("Enemy"),             // 任意
        QueryTriggerInteraction.UseGlobal       // 任意
    );

    for (int i = 0; i < count; i++)
    {
        var hit = buffer[i];
        // …処理…
    }
}

3. 2D 空間での範囲検出

3.1. Physics2D.OverlapCircleAll

// 指定円内の全 Collider2D を取得(全レイヤー対象)
Collider2D[] hits2D = Physics2D.OverlapCircleAll(
    (Vector2)transform.position,
    radius,
    layerMask                // 省略可
);

主な引数

  • point (Vector2):円の中心位置
  • radius (float):円の半径
  • layerMask(省略可, int):検出対象レイヤー

検出後の処理例

foreach (var hit in hits2D)
{
    // IDamageable2D 実装クラスへダメージ
    var dmg2D = hit.GetComponent<IDamageable2D>();
    if (dmg2D != null) dmg2D.TakeDamage(5);

    // SpriteRenderer があれば色を変更
    var sr = hit.GetComponent<SpriteRenderer>();
    if (sr != null) sr.color = Color.red;
}

3.2. OverlapCircleNonAlloc 版による最適化

// クラス外で一度だけ確保
private Collider2D[] buffer2D = new Collider2D[16];

void Update()
{
    int count2D = Physics2D.OverlapCircleNonAlloc(
        (Vector2)transform.position,
        radius,
        buffer2D,
        LayerMask.GetMask("Enemy")
    );
    for (int i = 0; i < count2D; i++)
    {
        var hit = buffer2D[i];
        // …処理…
    }
}

3.3. その他の 2D Overlap 系メソッド

  • OverlapPointAll(point):点重なり
  • OverlapBoxAll(center, size, angle):四角領域
  • OverlapAreaAll(pointA, pointB):矩形領域

4. 主な用途とポイント

  • 用途例:範囲攻撃、アイテム取得判定、センサー実装など
  • パフォーマンス:頻繁に呼ぶ場合は必ず NonAlloc 版を採用
  • レイヤーマスク:不要なオブジェクト検出を防ぎ、処理コストを削減

3D と 2D 両対応で実装を整えることで、さまざまなゲーム要件における効率的な範囲検出が可能になります。

訪問数 20 回, 今日の訪問数 1回