「今、プレイヤーが見ているものは何か?」「マウスでクリックした先に何があるか?」「キャラクターは地面に立っているか?」——ゲーム 開発では、こうした「空間への問いかけ」が頻繁に必要になります。
これに答えてくれるのが、Unityの物理エンジンが提供する Physics.Raycast です。ゲーム空間のある地点から、ある方向に向かって 目に見えない光線(Ray) を飛ばし、その光線が Collider(コライダー) を持つオブジェクトに当たったかどうか、当たったなら「何に・どこで・どれくらいの距離で」当たったかを教えてくれます。
この記事では、Physics.Raycastの基本的な使い方から、クリック選択・接地判定という2大定番レシピ、そして初心者が最も躓きやすいレイヤーマスクの活用法までを、実践的なC#コードを交えて解説します。
この記事でわかること
- Ray(始点+方向)と
RaycastHit(衝突情報)の基本概念- もっともシンプルなRaycastの書き方と
Debug.DrawRayでの可視化- 定番レシピ2つ: マウスクリックでオブジェクト選択・接地判定
- つまずきの元凶「レイヤーマスク」の指定方法と反転イディオム
- 敵・壁・空振りを1本のRayで撃ち分ける射撃の完成例
Raycastの基本概念:光線と衝突情報
Physics.Raycastは、文字通り「光線(Ray)」を投射して、その光線がColliderを持つオブジェクトと交差するかどうかを調べます。登場人物は2つだけです。

Ray(光線)とは
Rayは、「始点(Origin)」 と 「方向(Direction)」 の2つの要素で定義されます。「カメラの位置から、カメラの前方へ」「キャラクターの足元から、真下へ」のように、どこから・どちらへを決めれば1本のRayになります。
RaycastHit(衝突情報)とは
Rayがオブジェクトに衝突した場合、その詳細がRaycastHitという構造体に格納されます。主に使うのは次の情報です。
hit.collider: 衝突した相手のCollider(そこからgameObjectや他のコンポーネントへアクセス)hit.point: 衝突したワールド座標(着弾エフェクトを出す位置など)hit.normal: 衝突した面の法線ベクトル(弾痕を面に沿って向けるなど)hit.distance: 始点から衝突点までの距離
最もシンプルなRaycastの実装
最も基本的な使い方は、カメラの中心から前方にRayを飛ばし、何かに当たったかどうかを判定するものです。FPSの「照準が合っているものを調べる」がまさにこれです。
using UnityEngine;
public class SimpleRaycaster : MonoBehaviour
{
void Update()
{
// 始点: メインカメラの位置
Vector3 origin = Camera.main.transform.position;
// 方向: メインカメラの前方
Vector3 direction = Camera.main.transform.forward;
// 最大距離: 100メート ル
float maxDistance = 100f;
// Raycastを実行し、何かに当たったかどうかを判定
if (Physics.Raycast(origin, direction, out RaycastHit hit, maxDistance))
{
Debug.Log("オブジェクトに衝突しました: " + hit.collider.gameObject.name);
}
// シーンビューにRayの軌跡を描画(デバッグ用)
Debug.DrawRay(origin, direction * maxDistance, Color.red);
}
}
Physics.Raycastはブール値を返します。trueは衝突があったことを意味し、その際にout hitで指定した変数に衝突情報が書き込まれます。
tips: 「Raycastが当たらない」バグの調査は、まず
Debug.DrawRayでRayを見える化するのが最短ルートです。向きが逆だった・長さが足りなかった・そもそも別の場所から飛んでいた——のような原因が一目で分かります。エディタでの可視化全般は Gizmos入門 を参照してください。
定番レシピ1:マウスクリックでオブジェクトを選択する
Raycastの実用で最も出番が多いのが「クリックしたものを取得する」です。ポイントは、マウスのスクリーン座標から3D空間へのRayをScreenPointToRayで作ることです。画面は2D・世界は3Dなので、「画面上のこの点の奥に伸びる線」に変換してもらうイメージです。
