Unity入門

【Unity】RaycastとOverlapの使い方|視線・範囲・壁越えのオブジェクト検出を完全解説

使用環境

・Unity Editor:2021.3.18f1

この記事でわかること

  • Raycast(レイキャスト)を使ったオブジェクト検出の方法
  • OverlapSphere / OverlapBox を使った範囲検出の方法
  • 壁越えのオブジェクトを無視する方法(LayerMaskの活用)
  • レイキャストの最適化とパフォーマンス改善テクニック

UnityのRaycast / OverlapSphereとは?

ピッグダディ

今回は「UnityでのRaycastとOverlapの使い方」を解説していきますね。
ゲームで「目の前にいる敵を検出したい」「攻撃範囲内のオブジェクトを見つけたい」って思ったこと、ありませんか?

ピッグボーイ

あります!
照準の先にいる敵を見つけたいときに、
どこまで判定できるのかって悩みました。

ピッグガール

私は爆発エフェクトの範囲内にいる敵を検出したかったんですけど、
OverlapSphereとRaycastの違いがいまいちピンとこなくて

ピッグダディ

とてもいい視点ですね。
この記事では、Raycast・OverlapSphere・OverlapBoxの使い分けや、LayerMaskを使った壁越えの検出回避、デバッグ方法や最適化のポイントまで、しっかり解説していきますよ。

レイキャスト(Raycast)とは?

レイキャスト(Raycast)は、「見えないレーザー(Ray)」を発射し、その先にあるオブジェクトを検出する仕組みです

  • 照準の先にある敵を検出(FPSのヒットスキャン方式の銃)
  • 地面にレイを飛ばして、着地地点を計算(ジャンプ・ナビゲーション)
  • 壁や障害物がある場合に、物体を見えないようにする

・Raycastの基本的な構文

bool hit = Physics.Raycast(発射位置, 方向, out RaycastHit 情報, 距離, レイヤーマスク);

Raycastを使ったオブジェクト検出

基本的なRaycastの使い方

プレイヤーの正面にRayを飛ばし、オブジェクトに当たったか判定する

using UnityEngine;

public class RaycastExample : MonoBehaviour
{
    void Update()
    {
        Ray ray = new Ray(transform.position, transform.forward);
        RaycastHit hit;

        if (Physics.Raycast(ray, out hit, 10f))
        {
            Debug.Log("ヒット: " + hit.collider.gameObject.name);
        }

        // デバッグ用にRayをシーンビューで表示
        Debug.DrawRay(transform.position, transform.forward * 10f, Color.red);
    }
}

カメラやプレイヤーの色彩方向にレイを飛ばし、物体を検出!
Debug.DrawRayを使えば、シーンビューで確認できる!

特定のオブジェクトのみを検出(LayerMaskの活用)

レイヤーを指定して、特定のオブジェクトだけを検出

public LayerMask targetLayer; // 検出したいレイヤーを指定

void Update()
{
    Ray ray = new Ray(transform.position, transform.forward);
    RaycastHit hit;

    if (Physics.Raycast(ray, out hit, 10f, targetLayer))
    {
        Debug.Log("ターゲットにヒット: " + hit.collider.gameObject.name);
    }
}

➡壁越えの誤検出を防ぐためにをLayerMask活用!

すべてのオブジェクトを検出(RaycastAll)

壁の向こう側にあるオブジェクトもすべて検出したい場合に便利!

RaycastHit[] hits = Physics.RaycastAll(transform.position, transform.forward, 10f);
foreach (RaycastHit hit in hits)
{
    Debug.Log("複数ヒット: " + hit.collider.gameObject.name);
}

OverlapSphere / OverlapBoxを使った範囲検出

OverlapSphere(球体の範囲で検出)

一定範囲内にあるオブジェクトを検出

Collider[] colliders = Physics.OverlapSphere(transform.position, 5f);

foreach (Collider col in colliders)
{
    Debug.Log("範囲内のオブジェクト: " + col.gameObject.name);
}

➡爆風範囲・近くの敵の検出などに使える!

OverlapBox(ボックスの範囲で検出)

四角形のエリア内にあるオブジェクトを判定するのに最適!

Collider[] colliders = Physics.OverlapBox(transform.position, new Vector3(3f, 3f, 3f));

foreach (Collider col in colliders)
{
    Debug.Log("ボックス範囲内: " + col.gameObject.name);
}

レイキャストの最適化と注意点

不要な計算を減らす

・Raycastの距離を正しく設定(無駄な計算を減らす)
・LayerMaskを使って、対象のオブジェクトだけ判定

Raycastのヒット判定がうまく動作しないとき

・LayerMaskにオブジェクトのレイヤーが含まれているか確認
・コライダーがいないか確認(Is TriggerRaycastは通常トリガーを無視)
・オブジェクトのレイヤーがRigidbody正しく設定されているか確認

まとめ

  • Raycastは直線的なオブジェクト検出に最適!
  • OverlapSphere / OverlapBoxは範囲内のオブジェクトを検出するのに便利!
  • LayerMaskを活用すると、不要なオブジェクトの検出を防ぐ!
  • Debug.DrawRayを使って、レイのシミュレーション化をするとデバッグが簡単!