範囲検出によるコライダー取得(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回
ディスカッション
コメント一覧
まだ、コメントがありません