スポンサーリンク
Unity入門・基礎

【Unity】Raycast完全ガイド|当たらない原因・クリック判定・Layer無視まで解説

Unity入門・基礎

UnityでRaycastを使い始めると、かなりの確率で一度はこうなります。

  • クリックしているのに反応しない
  • Debug.Logが出ない
  • なぜか地面ばかり判定される
  • LayerMaskの書き方が暗号みたいに見える
  • 2Dなのに何も当たらない

私も最初の頃、「コードは合っているはずなのに、なぜ当たらないの…?」とかなり悩みました🙂

RaycastはUnityの中でも使用頻度が高い機能です。

クリック判定、敵の索敵、地面チェック、FPSの射撃判定など、ゲーム制作では本当にいろいろな場所で使われます。

ただ、そのぶん「Physics」「Collider」「Layer」「2D/3D」など複数の知識が一気に絡んでくるので、初心者のうちは混乱しやすいポイントでもあります。

特にやっかいなのが、エラーが出ていないのに動かないケースです。

スクリプトの問題なのか、Inspector設定なのか、Layerなのか、Triggerなのか…。原因候補が多いため、慣れていないと調査にかなり時間を取られてしまいます。

でも逆に言うと、Raycastは「何を確認すればいいか」が分かると、一気に扱いやすくなります。

Colliderが必要なのか。
Rayはどこから飛んでいるのか。
Layerで除外されていないか。

このあたりを整理できるだけで、クリック判定や当たり判定の実装がかなり安定してきます。

今回は、Raycastの基本構造から、クリック判定の作り方、LayerMaskの使い方、そして「当たらない時の原因」までまとめて整理していきます。


  1. Raycastは「Collider・方向・Layer」で理解すると失敗しにくい
  2. Unity Raycastの基本構造|Ray・Hit・Physics.Raycastを理解する
    1. Rayとは「どこから・どこへ飛ばすか」の情報
    2. RaycastHitで取得できる情報
    3. Physics.Raycastの基本形
    4. 初心者が混同しやすい「Collision」との違い
  3. Unity Raycastでクリック判定を作る方法
    1. Input.mousePositionでマウス座標を取得する
    2. ScreenPointToRayでRayを生成する
    3. クリックしたオブジェクトを取得するコード例
    4. タグ判定やコンポーネント取得に応用する
  4. Unity LayerMaskで特定オブジェクトだけ判定する方法
    1. LayerMaskを使わない場合の問題点
    2. LayerMaskの基本構文
    3. 特定Layerを無視する方法
    4. 初心者がつまずくビット演算の考え方
  5. Unity Raycastが当たらない原因チェックリスト
    1. Colliderが付いていない
    2. 2Dと3DのPhysicsを混同している
    3. Rayの方向がおかしい
    4. Rayの開始地点がCollider内部にある
    5. LayerMaskやTrigger設定で除外されている
    6. maxDistanceが足りない
  6. RaycastAll・SphereCast・NonAllocの使い分け
    1. RaycastAllは「貫通して全部取得」
    2. SphereCastは「太さを持つRaycast」
    3. RaycastNonAllocはGC削減向け
    4. 結局どれを選べばいい?
  7. Raycastで初心者が誤解しやすいポイント
    1. Raycastは「見えている物」に当たるわけではない
    2. UIは通常のPhysics.Raycastでは取れない
    3. Debug.DrawRayを使うと原因特定が一気に楽になる
    4. Layer設定は後回しにしない方がラク
  8. まとめ
  9. よくある質問(FAQ)
    1. 関連記事:

Raycastは「Collider・方向・Layer」で理解すると失敗しにくい

Raycastを難しく感じる原因は、「いろいろな設定が同時に関係している」からです。

でも実際には、まず次の3つを押さえるだけでかなり整理できます。

  • Colliderが付いているか
  • Rayが正しい方向へ飛んでいるか
  • Layerで除外されていないか

Raycastは、簡単に言うと「見えない線を飛ばして、何に当たるか調べる仕組み」です。

たとえばFPSゲームなら銃弾判定、脱出ゲームならクリック判定、アクションゲームなら地面チェックなどに使われます。

ただし、Raycastは“見た目”ではなくPhysics判定で動いています。

つまり、オブジェクトが画面に見えていても、Colliderが付いていなければ反応しません。

ここ、かなり重要です。

初心者のうちは「オブジェクトは存在しているのに当たらない!」となりやすいのですが、実際はCollider未設定だった…というケースが本当によくあります。

逆に、Colliderさえ付いていれば、透明なオブジェクトでもRaycastは当たります。

次に大事なのが、Rayの方向です。

Raycastは「どこから」「どちらへ」飛ばすかを指定する必要があります。

たとえばキャラクターの正面に飛ばしたいなら、こんなコードになります。

Ray ray = new Ray(transform.position, transform.forward);

transform.forward は「オブジェクトの前方向」を表しています。

ここが間違っていると、見当違いの方向へRayが飛びます。

Sceneビューで見ると、実は真上に飛んでいた…なんてこともあります🙂

そして最後がLayerです。

Raycastは、何も設定しないと基本的にすべてのColliderを対象にします。

そのため、

  • 地面ばかり当たる
  • 壁が邪魔で奥をクリックできない
  • 不要なオブジェクトに反応する

といった問題が起きやすくなります。

この時に使うのがLayerMaskです。

Layerを使うと、「敵だけ判定する」「UI用オブジェクトは無視する」など、判定対象を整理できます。

特にプロジェクトが大きくなるほど、Layer管理はかなり重要になります。

後回しにすると、あとで判定がぐちゃぐちゃになりやすいんですよね。

Raycastが当たらない時、初心者のうちはコードばかり見直してしまいがちです。

でも実際は、Inspector側の設定が原因のケースがかなり多いです。

まずは次の3つを確認するクセを付けると、原因特定がかなり早くなります。

確認項目よくある問題
Colliderそもそも付いていない
Ray方向違う方向へ飛んでいる
Layer除外されている



Unity Raycastの基本構造|Ray・Hit・Physics.Raycastを理解する

Raycastを使う時は、まず「何を準備しているのか」を整理すると理解しやすくなります。

基本的には、次の3つがセットです。

  • Ray(どこから・どこへ飛ばすか)
  • RaycastHit(何に当たったか)
  • Physics.Raycast(実際に判定する)

この3つの役割が分かると、コードの意味がかなり読みやすくなります。

Rayとは「どこから・どこへ飛ばすか」の情報

Rayは、「始点」と「方向」を持つデータです。

たとえば、プレイヤーの前方向へRayを飛ばしたい場合はこう書きます。

Ray ray = new Ray(transform.position, transform.forward);

transform.position が始点、transform.forward が方向です。

つまり、「プレイヤーの位置から前方向へ線を飛ばす」という意味になります。

ここで初心者が混乱しやすいのが、「方向ベクトル」です。

Raycastは“目的地”を指定するわけではありません。

「どちらへ飛ぶか」を指定しています。

なので、

new Vector3(10, 0, 0)

のような値を入れると、「X方向へ飛ばす」という意味になります。

「座標10に飛ばす」ではないので注意したいところです。

RaycastHitで取得できる情報

Rayが何かに当たると、衝突情報を取得できます。

その情報を保存するのが RaycastHit です。

RaycastHit hit;

この変数には、次のような情報が入ります。

  • どのオブジェクトに当たったか
  • どの位置に当たったか
  • どれくらいの距離だったか

特によく使うのはこのあたりです。

hit.collider
hit.transform
hit.point
hit.distance

たとえば、クリックしたオブジェクト名を表示するならこう書けます。

Debug.Log(hit.collider.name);

ゲーム制作ではかなり便利で、

  • 敵をクリックしたら攻撃
  • アイテムをクリックしたら取得
  • 床をクリックした場所へ移動

など、いろいろな処理へ応用できます。

Physics.Raycastの基本形

実際に判定するのが Physics.Raycast です。

基本形はこんな感じです。

RaycastHit hit;

if (Physics.Raycast(ray, out hit))
{
    Debug.Log(hit.collider.name);
}

Physics.Raycast() は、当たったかどうかを bool で返します。

つまり、

  • true → 何かに当たった
  • false → 何にも当たっていない

という意味です。

そのため、if文と相性が良いんですね。

また、out hit は「当たった情報をhit変数へ入れてください」という意味です。

最初は少し独特に見えますが、「結果を受け取る箱」くらいのイメージで大丈夫です。

初心者が混同しやすい「Collision」との違い

Raycastとよく混同されるのが、OnCollisionEnter などのCollision系です。

この2つは役割がかなり違います。

機能役割
Raycast線を飛ばして調べる
Collision実際に接触した時に反応する

たとえばFPSの銃なら、実際に弾オブジェクトを飛ばさず、Raycastだけでヒット判定するケースも多いです。

逆に、ボールが壁にぶつかるような物理挙動ではCollision系を使います。

「問い合わせ判定」なのか、「物理接触」なのか。

ここを分けて考えると、UnityのPhysics周りがかなり理解しやすくなります。

Unityの基礎を体系的に整理したい場合は、PhysicsやColliderの基本をまとめて学べる書籍もかなり役立ちます。

Unityの教科書 Unity 6完全対応版
✅ Amazonでチェックする✅ 楽天でチェックする




Unity Raycastでクリック判定を作る方法

Raycastで最もよく使われるのが、マウスクリック判定です。

「クリックしたオブジェクトを取得したい」という場面はかなり多いんですよね。

たとえば、

  • アイテムをクリックして取得する
  • 敵をクリックして攻撃する
  • ドアをクリックして開く
  • 床クリックで移動する

など、ゲームのインタラクション処理で頻繁に登場します。

クリック判定の流れは、次の4ステップです。

  1. マウス座標を取得する
  2. Rayを生成する
  3. Raycastする
  4. 当たったオブジェクトを処理する

順番に見ていきましょう。

Input.mousePositionでマウス座標を取得する

まずは、現在のマウス位置を取得します。

Input.mousePosition

これは画面上の座標です。

ここで大事なのが、「ワールド座標ではない」という点です。

たとえば1920×1080の画面なら、

  • 左下 → (0, 0)
  • 右上 → (1920, 1080)

のような“画面位置”になります。

そのため、このままでは3D空間の位置判定には使えません。

そこで必要になるのがRayです。

ScreenPointToRayでRayを生成する

画面座標を3D空間へ変換するために、カメラからRayを飛ばします。

Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);

これで、「カメラからマウス位置へ向かうRay」が作られます。

初心者のうちは、ここがかなり混乱しやすいポイントです。

「マウス座標を直接使えばいいのでは?」と思いやすいのですが、3D空間では“画面位置”だけでは奥行きが分かりません。

そのため、カメラから線を飛ばして判定しているわけですね。

なお、Camera.main は MainCamera タグが付いたカメラを取得しています。

MainCameraタグが外れていると、NullReferenceExceptionになるので注意してください。

クリックしたオブジェクトを取得するコード例

クリック判定の基本形はこんな感じです。

using UnityEngine;

public class RaycastClick : MonoBehaviour
{
    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);

            RaycastHit hit;

            if (Physics.Raycast(ray, out hit))
            {
                Debug.Log(hit.collider.name);
            }
        }
    }
}

これで、クリックしたオブジェクト名がConsoleへ表示されます。

かなりシンプルですが、実はここにRaycastの基本が全部詰まっています。

まずはこの形を基準にすると、トラブル時も原因を探しやすくなります。

ちなみに、反応しない時はまず以下を確認すると早いです。

  • Colliderが付いているか
  • MainCameraタグが付いているか
  • Physics.Raycastを使っているか
  • 2Dオブジェクトではないか

特に2Dゲームなのに3D用の Physics.Raycast を使っているケースはかなり多いです🙂

タグ判定やコンポーネント取得に応用する

Raycastは「何に当たったか」を取得できるので、そこからさらに処理を分岐できます。

たとえばタグ判定ならこう書けます。

if (hit.collider.CompareTag("Enemy"))
{
    Debug.Log("敵をクリックしました");
}

CompareTag() は、タグ比較でよく使われる定番です。

文字列比較より安全で高速なので、Unityではこちらがよく使われます。

また、コンポーネント取得もできます。

Enemy enemy = hit.collider.GetComponent<Enemy>();

if (enemy != null)
{
    enemy.TakeDamage(10);
}

これができるようになると、クリック操作の幅がかなり広がります。

脱出ゲーム、RTS、シミュレーション、FPSなど、本当にいろいろなジャンルで活躍します。

クリック判定の練習用として、シンプルな3Dオブジェクトを大量に配置できるアセットはかなり便利です。

POLYGON Starter Pack
✅アセットストアでチェックする




Unity LayerMaskで特定オブジェクトだけ判定する方法

Raycastを使い始めると、次にぶつかりやすいのが「余計なオブジェクトにも当たる問題」です。

たとえば、

  • 敵をクリックしたいのに地面に当たる
  • 壁が邪魔して奥のオブジェクトを取得できない
  • UI用オブジェクトまで反応する

こういう時に使うのが LayerMask です。

LayerMaskを使うと、「どのLayerを判定対象にするか」を制御できます。

Raycastを長く使うほど、この機能の重要性がかなり分かってきます。

LayerMaskを使わない場合の問題点

通常のRaycastは、基本的にすべてのColliderを対象にします。

つまり、途中に壁や床があると、そちらへ先に当たってしまいます。

たとえばこんなコードです。

Physics.Raycast(ray, out hit);

この状態では、Layer制限がありません。

小規模なサンプルでは問題なくても、オブジェクトが増えると判定管理がかなり難しくなります。

特に、

  • 背景
  • 装飾
  • 透明壁
  • UI用オブジェクト

などが混在し始めると、「なぜそこに当たるの?」という状況が起きやすくなります。

そのため、早めにLayerを整理しておくのがおすすめです。

LayerMaskの基本構文

特定Layerだけを判定したい場合は、LayerMaskを指定します。

int layerMask = 1 << 6;

これは「Layer 6だけを判定対象にする」という意味です。

その後、Raycastへ渡します。

Physics.Raycast(ray, out hit, 100f, layerMask);

これで、Layer 6 のColliderだけに反応するようになります。

最初は 1 << 6 がかなり難しく見えるかもしれません。

でも実際には、「LayerのスイッチをONにしている」くらいのイメージで大丈夫です。

数学っぽく見えますが、Unityでは定番の書き方です。

ちなみに、Layer番号は Inspector の Layer設定から確認できます。

番号を間違えると全然反応しないので、ここは注意したいポイントですね。

特定Layerを無視する方法

逆に、「このLayerだけ無視したい」というケースもあります。

たとえば、プレイヤー自身にはRayを当てたくない場合などですね。

その時は ~ を使います。

int layerMask = ~(1 &lt;&lt; 6);

これは「Layer 6以外すべて判定する」という意味になります。

FPSのプレイヤー自身や、透明な補助Colliderを除外したい時によく使われます。

また、Unityには最初から Ignore Raycast という専用Layerも用意されています。

このLayerに設定されたオブジェクトは、通常のRaycastでは無視されます。

デバッグ用オブジェクトなどに使うと便利です。

初心者がつまずくビット演算の考え方

LayerMaskで急に難しく感じやすいのが、ビット演算です。

ただ、実際には「Layerを選択する仕組み」だと思えばOKです。

たとえば、こんなイメージです。

Layer状態
EnemyON
GroundOFF
PlayerOFF

つまり、「どのLayerを有効にするか」を切り替えているだけなんですね。

UnityではLayer管理がかなり重要です。

オブジェクト数が増えてから整理しようとすると、本当に大変になります🙂

特にRaycastはPhysics周り全体に関わるので、早めにLayerを分けておくと後でかなりラクになります。




Unity Raycastが当たらない原因チェックリスト

Raycastで一番多い悩みが、「コードを書いたのに当たらない問題」です。

しかも厄介なのが、エラーが出ないケースがかなり多いことなんですよね。

そのため、「コードは合っているはずなのに…」と長時間悩みやすいポイントでもあります。

ただ、Raycastの不具合は原因パターンがかなり決まっています。

特に初心者のうちは、まず次のチェック項目を確認すると原因特定が早くなります。

Colliderが付いていない

まず最優先で確認したいのがこれです。

RaycastはColliderにしか当たりません。

つまり、

  • Cube
  • Sphere
  • MeshCollider
  • BoxCollider

などが付いていないと、見えていても反応しません。

特に3Dモデルをインポートした直後は、Collider未設定のケースがかなりあります。

Hierarchyでオブジェクトを選択し、Inspectorを確認してみましょう。

「RendererはあるけどColliderがない」という状態は本当によくあります。

2Dと3DのPhysicsを混同している

これもかなり多いです。

UnityのPhysicsは、2Dと3Dで完全に別システムになっています。

用途使うAPI
3DゲームPhysics.Raycast
2DゲームPhysics2D.Raycast

つまり、

  • BoxCollider2D
  • Rigidbody2D

を使っているのに、

Physics.Raycast()

を書いても反応しません。

この場合は、

Physics2D.Raycast()

を使う必要があります。

「Colliderは付いているのに当たらない」という時は、かなり疑わしいポイントです。

Rayの方向がおかしい

Rayが見当違いの方向へ飛んでいるケースもよくあります。

特に、

  • transform.forward
  • Vector3.forward
  • ローカル座標
  • ワールド座標

の違いで混乱しやすいです。

たとえば、オブジェクトが回転している場合、transform.forward は向きに合わせて変化します。

一方、Vector3.forward は常にワールド前方向です。

ここがズレると、「思っていた方向に飛ばない」という状態になります。

そんな時に便利なのが Debug.DrawRay です。

Debug.DrawRay(transform.position, transform.forward * 10f, Color.red);

これを使うと、SceneビューでRayの方向を可視化できます。

Raycastのデバッグではかなり便利なので、ぜひ覚えておきたい機能です。

Rayの開始地点がCollider内部にある

意外と見落としやすいのが、Rayの原点問題です。

Raycastは、開始地点がCollider内部にあると正常に判定できない場合があります。

特に起きやすいのが、

  • プレイヤー中心からRayを飛ばす
  • CharacterController付近
  • 足元判定

などです。

この場合は、少し位置をずらすと改善することがあります。

Vector3 origin = transform.position + Vector3.up * 0.1f;

ほんの少し浮かせるだけで直るケースもあります。

LayerMaskやTrigger設定で除外されている

LayerMask設定が原因で、対象が除外されていることもあります。

特に、

  • Ignore Raycast Layer
  • LayerMask指定ミス
  • QueryTriggerInteraction

あたりは確認したいポイントです。

Trigger判定を無視している場合、Trigger Colliderには当たりません。

QueryTriggerInteraction.Ignore

を使っている時は注意ですね。

逆に、Triggerも判定したいなら、

QueryTriggerInteraction.Collide

を使います。

maxDistanceが足りない

Rayの長さ不足もよくあります。

たとえば、

Physics.Raycast(ray, out hit, 3f)

なら、3メートル先までしか判定しません。

対象が遠いと当然当たりません。

「たまに反応する」「近づくと動く」という場合は、距離不足を疑ってみると良いです。

特にFPSやTPSでは、想像以上に距離が必要になることがあります。




RaycastAll・SphereCast・NonAllocの使い分け

Raycastに慣れてくると、「もっと複雑な判定をしたい」と感じる場面が増えてきます。

そんな時によく登場するのが、

  • RaycastAll
  • SphereCast
  • RaycastNonAlloc

です。

名前が似ているので混乱しやすいのですが、それぞれ役割がかなり違います。

ここを整理しておくと、「どの判定方法を選べばいいか」が判断しやすくなります。

RaycastAllは「貫通して全部取得」

通常のRaycastは、最初に当たった1つだけを取得します。

でも、「途中にあるものを全部取得したい」ケースもあります。

そんな時に使うのが Physics.RaycastAll です。

RaycastHit[] hits = Physics.RaycastAll(ray);

これで、Ray上にあるColliderをまとめて取得できます。

たとえば、

  • 貫通弾
  • レーザー
  • 複数敵への判定
  • 壁越しスキャン

などで便利です。

ただし、初心者のうちは注意点もあります。

RaycastAll は、取得順が距離順とは限らない場合があります。

そのため、「近い順で処理したい」ならソートが必要になるケースがあります。

System.Array.Sort(hits, (a, b) =&gt; a.distance.CompareTo(b.distance));

最初は通常のRaycastだけでも十分な場面が多いので、「複数取得が必要になったら使う」くらいでOKです。

SphereCastは「太さを持つRaycast」

通常のRaycastは“線”です。

つまり、かなり細い判定になります。

そのため、高速移動や細かいエイムでは、すり抜けのような問題が起きることがあります。

そんな時に使われるのが SphereCast です。

Physics.SphereCast(origin, radius, direction, out hit);

これは、「球体を前へ転がすような判定」になります。

イメージとしては、Raycastに太さを持たせた感じですね。

特に使われやすいのは、

  • FPSのエイム補助
  • キャラクター接地判定
  • 壁チェック
  • 狭い隙間の判定補助

です。

実際のゲームでは、完全な1本線よりも、少し太さがある方がプレイ感が自然になることも多いです。

「Raycastだとシビアすぎる」と感じたら、SphereCastを検討するとかなり改善する場合があります。

RaycastNonAllocはGC削減向け

RaycastAll は便利ですが、毎回配列を生成します。

つまり、大量実行するとGC Alloc(メモリ確保)が増えやすいです。

そこで使われるのが Physics.RaycastNonAlloc です。

RaycastHit[] results = new RaycastHit[10];

int hitCount = Physics.RaycastNonAlloc(ray, results);

これは、事前に用意した配列へ結果を書き込む仕組みです。

新しい配列生成を減らせるため、パフォーマンス改善につながる場合があります。

ただし、初心者のうちは無理に使わなくても大丈夫です。

まずは通常のRaycastを安定して扱える方が重要です。

NonAlloc系は、

  • 大量敵AI
  • 毎フレーム大量判定
  • モバイル最適化

など、“負荷が問題になってから”検討するくらいで十分です。

結局どれを選べばいい?

迷った時は、まず用途で考えるのがおすすめです。

やりたいことおすすめ
クリック判定Raycast
貫通して全部取得RaycastAll
少し広めに判定SphereCast
GC削減・最適化RaycastNonAlloc

まずは通常の Physics.Raycast をしっかり使えるようになるのが大切です。

そこから「判定が足りない」と感じた時に、用途に応じて広げていくと理解しやすいですよ。




Raycastで初心者が誤解しやすいポイント

Raycastは便利な機能ですが、初心者のうちは「思っていた動きと違う…」となりやすいポイントも多いです。

特に、見た目とPhysics判定の違いで混乱しやすいんですよね。

ここでは、実際によくある誤解を整理しておきます。

Raycastは「見えている物」に当たるわけではない

Raycastは、画面に見えているかどうかではなく、「Colliderがあるか」で判定しています。

つまり、

  • 見えていてもColliderがなければ当たらない
  • 透明でもColliderがあれば当たる

ということです。

ここはかなり大事です。

たとえば、3Dモデルを配置しただけではColliderが付いていないケースがあります。

見た目はあるので、「そこにあるのに反応しない!」となりやすいんですね。

逆に、透明な当たり判定用オブジェクトを置いて、そこだけRaycast対象にする設計もよく使われます。

Raycastは“見た目”ではなく“Physics空間”で動いている、という意識を持つとかなり理解しやすくなります。

UIは通常のPhysics.Raycastでは取れない

これもかなり混乱しやすいポイントです。

UnityのUIは、通常の3Dオブジェクトとは別システムで動いています。

そのため、

Physics.Raycast()

を書いても、ButtonやImageには反応しないことがあります。

UI判定では、基本的に GraphicRaycasterEventSystem を使います。

特に、

  • UIのButtonが押せない
  • UIの裏側へRaycastが通る
  • クリックが競合する

といった問題は起きやすいです。

「PhysicsのRaycast」と「UIのRaycast」は別物、と整理すると混乱しにくくなります。

Debug.DrawRayを使うと原因特定が一気に楽になる

Raycastのデバッグで本当に便利なのが Debug.DrawRay です。

Debug.DrawRay(transform.position, transform.forward * 10f, Color.red);

これを書くと、Sceneビュー上でRayの方向を確認できます。

Raycastが当たらない時、実際には「変な方向へ飛んでいた」というケースはかなり多いです。

特に、

  • transform.forwardの向き
  • カメラ方向
  • ローカル座標
  • 回転状態

が絡むと、人間の感覚とズレやすくなります。

そんな時に可視化できると、一気に原因特定しやすくなるんですよね。

私もRaycast周りで困った時は、まずDebug.DrawRayを入れることがかなり多いです🙂

Layer設定は後回しにしない方がラク

小規模なサンプルでは、Layerをほとんど使わなくても動きます。

でも、オブジェクト数が増えると急に管理が難しくなります。

たとえば、

  • プレイヤー
  • 地面
  • 装飾
  • 透明Collider
  • UI用オブジェクト

などが混在すると、「どれに当たるべきか」がかなり複雑になります。

その状態でLayer整理を始めると、後から大量修正が必要になることもあります。

特にRaycastは、Physics全体に関わる機能です。

最初のうちから、

  • Enemy
  • Ground
  • Player
  • Interactable

などを分けておくと、あとでかなり助かります。

「今はまだ小さいプロジェクトだから大丈夫」と思っていても、後半でLayer地獄になることは本当によくあります🙂




まとめ

Raycastは、最初のうちはかなり混乱しやすい機能です。

特にUnity初心者の頃は、

  • コードは合っているのに反応しない
  • なぜか別のオブジェクトに当たる
  • 2Dなのに判定できない
  • LayerMaskが難しく感じる

など、いろいろな壁にぶつかりやすいんですよね。

でも実際には、Raycastで大事なのはかなりシンプルです。

まず確認したいのは、次の3つです。

  • Colliderが付いているか
  • Rayが正しい方向へ飛んでいるか
  • Layerで除外されていないか

この3つを意識するだけで、かなり原因特定しやすくなります。

特に初心者のうちは、「コードが悪いはず」と考えがちです。

でも実際には、Inspector設定やLayer設定が原因のケースはかなり多いです。

私も最初の頃、コードばかり見直していて、原因が「Collider付け忘れ」だったことが何回もありました🙂

Raycastは、“Physics空間を調べる機能”です。

そのため、見た目だけではなく、ColliderやPhysics設定を意識することがかなり重要になります。

また、困った時は Debug.DrawRay を使うのがおすすめです。

Rayがどこへ飛んでいるか可視化できるだけで、問題がかなり見つけやすくなります。

特に、

  • transform.forward
  • カメラ方向
  • LayerMask
  • 2D/3D Physics

あたりは、実際に線を見ながら確認すると理解が深まりやすいです。

Raycastは、クリック判定・索敵・地面判定・FPS射撃など、本当にいろいろな場面で使われます。

最初は少し難しく感じても、「線を飛ばして調べているだけ」と考えると、一気に整理しやすくなりますよ。


参考資料


よくある質問(FAQ)

Q
RaycastとColliderの違いは?
A

かなり混同されやすいのですが、この2つは役割が違います。

Colliderは「当たり判定そのもの」です。

一方、Raycastは「その当たり判定に向かって線を飛ばして調べる機能」です。

つまり、Colliderが存在しないと、Raycastは基本的に反応できません。

イメージとしては、

  • Collider → 壁や物体
  • Raycast → 懐中電灯の光

みたいな感じです。

光を当てる対象がなければ、何も検知できないわけですね。

Q
2DゲームでもRaycastは使えますか?
A

使えます。

ただし、2D用Physicsを使う必要があります。

3D用の

Physics.Raycast()

ではなく、

Physics2D.Raycast()

を使います。

また、Colliderも2D用です。

  • BoxCollider2D
  • CircleCollider2D
  • Rigidbody2D

などを使用します。

Unityでは2Dと3Dが別Physicsなので、「Colliderはあるのに反応しない」という時はかなり疑いたいポイントです。

Q
毎フレームRaycastしても大丈夫ですか?
A

普通の規模なら問題ないケースが多いです。

実際、

  • FPSの視線判定
  • 地面チェック
  • 敵索敵
  • インタラクト判定

などでは、毎フレームRaycastすることもよくあります。

ただし、大量実行すると負荷が増える可能性があります。

特に注意したいのは、

  • 大量AI
  • モバイル端末
  • RaycastAll連打
  • 毎フレーム大量GC発生

などです。

その場合は、

  • 判定回数を減らす
  • 距離制限を付ける
  • LayerMaskで対象を減らす
  • NonAlloc系を使う

などを検討すると改善しやすくなります。

ただ、初心者のうちは「まず正しく動くこと」を優先した方が学習しやすいです。

最適化は、“重くなってから考える”くらいでも十分なケースが多いですよ。

※当サイトはアフィリエイト広告を利用しています。リンクを経由して商品を購入された場合、当サイトに報酬が発生することがあります。

※本記事に記載しているAmazon商品情報(価格、在庫状況、割引、配送条件など)は、執筆時点のAmazon.co.jp上の情報に基づいています。
最新の価格・在庫・配送条件などの詳細は、Amazonの商品ページをご確認ください。

スポンサーリンク