OverlapSphereとSphereCast
CoddyのUnityジャーニー「物理演算とゲームプレイ」セクションの一部。レッスン 40/71。
レイは直線について調べます。Physics.OverlapSphere(center, radius)は球状の領域について調べます。centerを中心とする球に触れているすべてのコライダーを配列で返し、方向も距離も指定しません。この爆弾は爆発すると、3 units以内にあるすべての木箱を破壊します。
void Explode()
{
Collider[] hits = Physics.OverlapSphere(transform.position, 3f);
foreach (Collider c in hits)
{
if (c.CompareTag("Crate"))
{
Destroy(c.gameObject);
}
}
Destroy(gameObject);
}配列には範囲内にあるものがすべて含まれます。床、壁、そして爆弾自身のコライダーも含まれます。重なり判定では、開始位置ですでに内部にあるコライダーを除外しないためです。そのため、ループでは処理を行う前にタグを確認します。各コライダーのattachedRigidbodyは、そのコライダーが属するRigidbodyです。床などの静的な物体の場合はnullです。
Physics.SphereCast(origin, radius, direction, out hit, maxDistance)は太さのあるレイです。球を直線に沿って動かし、その球が最初にぶつかるコライダーを報告します。半径1の岩が、幅1.5の隙間を通って転がろうとしているとき、通り抜けられるかを調べます。隙間の中央に沿った細いレイは何にも当たりませんが、球形キャストは柱に当たります。レイと同様、球形キャストも開始位置ですでに触れているコライダーは無視します。
チャレンジ
中級Physics.SphereCastを使って、砲台のビームを広くしましょう。
- スペースキーを押したときに、球体をスイープします:
Physics.SphereCast(transform.position, radius, transform.forward, out RaycastHit hit, range)。 - 命中したら、
"Hit " + hit.collider.nameをログに出力します(最初のショットではHit Poleと出力されます)。そして、そのオブジェクトを破棄します。 - 外れたら、
Missをログに出力します。
「プレイ」を押して3回発射します。最初にPoleが消え、次にCrateが消え、その後Missとなります。それから「確認」を押してください。
自分で試してみよう
using UnityEngine;
public class Beam : MonoBehaviour
{
public float radius = 0.5f;
public float range = 12f;
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
// 半径 radius の球を前方にスイープし、最初に当たったものを破壊する。
}
}
}
物理演算とゲームプレイのすべてのレッスン
自分で練習してみよう: Unityプレイグラウンド