UnityでRaycastを使い始めると、かなりの確率で一度はこうなります。
- クリックしているのに反応しない
- Debug.Logが出ない
- なぜか地面ばかり判定される
- LayerMaskの書き方が暗号みたいに見える
- 2Dなのに何も当たらない
私も最初の頃、「コードは合っているはずなのに、なぜ当たらないの…?」とかなり悩みました🙂
RaycastはUnityの中でも使用頻度が高い機能です。
クリック判定、敵の索敵、地面チェック、FPSの射撃判定など、ゲーム制作では本当にいろいろな場所で使われます。
ただ、そのぶん「Physics」「Collider」「Layer」「2D/3D」など複数の知識が一気に絡んでくるので、初心者のうちは混乱しやすいポイントでもあります。
特にやっかいなのが、エラーが出ていないのに動かないケースです。
スクリプトの問題なのか、Inspector設定なのか、Layerなのか、Triggerなのか…。原因候補が多いため、慣れていないと調査にかなり時間を取られてしまいます。
でも逆に言うと、Raycastは「何を確認すればいいか」が分かると、一気に扱いやすくなります。
Colliderが必要なのか。
Rayはどこから飛んでいるのか。
Layerで除外されていないか。
このあたりを整理できるだけで、クリック判定や当たり判定の実装がかなり安定してきます。
今回は、Raycastの基本構造から、クリック判定の作り方、LayerMaskの使い方、そして「当たらない時の原因」までまとめて整理していきます。
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ステップです。
- マウス座標を取得する
- Rayを生成する
- Raycastする
- 当たったオブジェクトを処理する
順番に見ていきましょう。
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 << 6);
これは「Layer 6以外すべて判定する」という意味になります。
FPSのプレイヤー自身や、透明な補助Colliderを除外したい時によく使われます。
また、Unityには最初から Ignore Raycast という専用Layerも用意されています。
このLayerに設定されたオブジェクトは、通常のRaycastでは無視されます。
デバッグ用オブジェクトなどに使うと便利です。
初心者がつまずくビット演算の考え方
LayerMaskで急に難しく感じやすいのが、ビット演算です。
ただ、実際には「Layerを選択する仕組み」だと思えばOKです。
たとえば、こんなイメージです。
| Layer | 状態 |
|---|---|
| Enemy | ON |
| Ground | OFF |
| Player | OFF |
つまり、「どの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) => 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判定では、基本的に GraphicRaycaster や EventSystem を使います。
特に、
- 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)
- QRaycastとColliderの違いは?
- A
かなり混同されやすいのですが、この2つは役割が違います。
Colliderは「当たり判定そのもの」です。
一方、Raycastは「その当たり判定に向かって線を飛ばして調べる機能」です。
つまり、Colliderが存在しないと、Raycastは基本的に反応できません。
イメージとしては、
- Collider → 壁や物体
- Raycast → 懐中電灯の光
みたいな感じです。
光を当てる対象がなければ、何も検知できないわけですね。
- Q2Dゲームでも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の商品ページをご確認ください。