Menu
CoddyTech

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の隙間を通って転がろうとしているとき、通り抜けられるかを調べます。隙間の中央に沿った細いレイは何にも当たりませんが、球形キャストは柱に当たります。レイと同様、球形キャストも開始位置ですでに触れているコライダーは無視します。

challenge icon

チャレンジ

中級

Physics.SphereCastを使って、砲台のビームを広くしましょう。

  1. スペースキーを押したときに、球体をスイープします:Physics.SphereCast(transform.position, radius, transform.forward, out RaycastHit hit, range)。
  2. 命中したら、"Hit " + hit.collider.nameをログに出力します(最初のショットではHit Poleと出力されます)。そして、そのオブジェクトを破棄します。
  3. 外れたら、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プレイグラウンド