リンドくん
先生、シューティングゲームで敵に弾が当たったかどうかって、どうやって判定するんですか?
たなべ
Raycast(レイキャスト)という仕組みを使うのが一般的なんだ。
これは目に見えない「光線」を飛ばして、何かに当たったかを検出する技術なんだよ。
リンドくん
目に見えない光線...?なんだか難しそうです。
たなべ
心配しないで。考え方はとてもシンプルなんだ。
今日はRaycastの基本からシューティングゲームへの応用まで、ゲーム開発でよく使う技術をじっくり学んでいこう。
Unityでゲームを作り始めると、必ず必要になる技術の一つがオブジェクトの検出です。
プレイヤーが敵を攻撃したとき、弾が敵に当たったかどうか。キャラクターの前に壁があるかどうか。こうした判定を行うのがRaycast(レイキャスト)という機能です。
Raycastは、3Dゲーム開発において最も基本的で重要な技術の一つと言えます。シューティングゲームだけでなく、アドベンチャーゲームやアクションゲームなど、ほぼすべてのジャンルで活用されています。
この記事では、Unityを学び始めたばかりの方でも理解できるよう、Raycastの基本概念からシューティングゲームの基本実装まで、段階的に解説していきます。
HackATAは、エンジニアを目指す方のためのプログラミング学習コーチングサービスです。 経験豊富な現役エンジニアがあなたの学習をサポートします。
✓ 質問し放題
✓ β版公開中(2025年内の特別割引)
リンドくん
そもそもRaycastって、具体的にどういう仕組みなんですか?
たなべ
イメージとしてはレーザーポインターを想像してみて。
レーザーを壁に向けて照射すると、壁に赤い点が見えるよね。Raycastもそれと同じで、ある地点から特定の方向に目に見えない線を飛ばして、何かに当たったかを検出するんだ。

Raycastの概念
Raycastは日本語で「光線投射」と訳されます。その名の通り、仮想的な光線(Ray)を特定の方向に飛ばし、その光線が何かのオブジェクトに衝突したかを検出する技術です。
この仕組みには以下のような特徴があります。
ゲーム開発において、Raycastは以下のような場面で必須の技術となります。
特にシューティングゲームでは、Raycastを使わない実装は考えられないほど重要な技術です。物理的な弾のオブジェクトを飛ばす方法もありますが、高速な弾の場合はRaycastを使う方が正確で効率的なのです。
Unityには主に2つのRaycast方式があります。
この記事では、3Dゲームで使用するPhysics.Raycastを中心に解説していきます。
リンドくん
実際にどうやってコードを書けばいいんですか?
たなべ
基本的な使い方は意外とシンプルなんだよ。
まずは最もシンプルなRaycastの例から見ていこうか。
まずは、オブジェクトの前方に光線を飛ばして、何かに当たったかを検出する基本的なコードを見てみましょう。
このコードでは、以下のことを行っています。
Rayオブジェクトを作成 - 始点(transform.position)と方向(transform.forward)を指定Physics.Raycastで光線を飛ばす - 10単位先まで検出trueが返される - 当たった場合にメッセージを表示次は、当たったオブジェクトの詳細情報を取得してみましょう。
RaycastHitという構造体を使うことで、以下のような情報が取得できます。
開発中は、Rayが実際にどこに飛んでいるのかを視覚的に確認したいものです。そんなときはDebug.DrawRayを使いましょう。
Debug.DrawRayを使うと、UnityエディタのScene viewでRayが赤い線として表示されます。これにより、Rayが意図した方向に飛んでいるかを確認できるので、デバッグがとても楽になります。
リンドくん
基本はわかりました!でも実際のシューティングゲームではどう使うんですか?
たなべ
よし、それじゃあ実際に銃を撃つシステムを作ってみよう。
マウスをクリックしたら弾を発射して、敵に当たったらダメージを与える、という本格的なシステムだよ。
まずは、シンプルなシューティングシステムを作ってみましょう。
このコードのポイントは以下の通りです。
GetComponent<Enemy>()で敵スクリプトを取得上記のシューティングシステムと連携する、敵のダメージ処理スクリプトも作成しましょう。
次は、射撃エフェクトや着弾エフェクトも含めた、より本格的なシステムを見てみましょう。
この実装では以下の機能が追加されています。
fireRateで連射速度を制御リンドくん
敵以外のオブジェクトにも弾が当たっちゃうんですけど、敵だけを狙いたいときはどうするんですか?
たなべ
それにはレイヤーマスクという仕組みを使うんだ。
特定のレイヤーのオブジェクトだけを検出対象にできるから、とても便利なんだよ。
特定のレイヤーのオブジェクトだけを検出したい場合は、レイヤーマスクを使います。
UnityエディタでtargetLayersに「Enemy」レイヤーだけを設定すれば、敵オブジェクトだけに反応するようになります。
レイヤーと並んでよく使われるのがタグによる判定です。
タグを使うことで、当たったオブジェクトの種類に応じて異なる処理を実行できます。
それぞれの使い分けは以下のような感じです。
一般的に、パフォーマンスを重視する場合はレイヤーマスクを使うことが推奨されます。なぜなら、不要なオブジェクトは最初から検出対象外にできるからです。
リンドくん
実際に作ってみたんですけど、うまく当たり判定が取れないことがあるんです...
たなべ
Raycastでよくつまずくポイントがいくつかあるんだよね。
代表的な問題とその解決方法を見ていこう。
症状: Raycastが何にも当たらない
原因: 対象のオブジェクトにColliderコンポーネントがついていない
解決法
敵オブジェクトには必ずBox ColliderやCapsule Colliderなどを追加してください。
症状: 意図しない場所からRayが飛んでいる
解決法
Debug.DrawRayで必ず可視化して、Rayが正しい位置から飛んでいるか確認しましょう。
症状: 特定のオブジェクトだけ検出されない
解決法
Physics.Raycastのレイヤーマスク引数が正しく渡されているか確認症状: 遠くの敵に当たらない
解決法
リンドくん
Raycastって最初は難しそうでしたけど、理解できました!
たなべ
よく頑張ったね!Raycastはゲーム開発で最も使う技術の一つだから、今日学んだことはこれからずっと役に立つよ。
まずは簡単なシューティングゲームから作り始めてみよう。
この記事では、UnityのRaycastを使ったオブジェクト検出とシューティングゲームの実装について解説してきました。
重要なポイントをおさらいしましょう。
RayオブジェクトとPhysics.Raycastを組み合わせて使いますRaycastHitで当たったオブジェクトの詳細情報を取得できますDebug.DrawRayで可視化してデバッグすると開発がスムーズになりますシューティングゲームだけでなく、アドベンチャーゲームやパズルゲームなど、ほぼすべてのゲームジャンルで使える基本技術です。今回学んだ内容を活かして、ぜひ自分だけのゲームを作ってみてください。
Raycastの理解が深まれば、より高度なゲーム開発にも挑戦できるようになります。まずは今回紹介したサンプルコードを実際に動かしてみて、少しずつ自分なりにカスタマイズしていくことをおすすめします。
ゲーム開発は試行錯誤の連続ですが、その分完成したときの達成感は格別です。あなたのゲーム開発が実り多きものになることを願っています。