
【Unity】Raycastの使い方~Rayを飛ばして形も変化させてみよう!~
2021.12.20
UnityでRaycastを使いこなそう!
今回は、Unityの「Raycast」の基本的な使い方について解説してきます!
Raycast を使いこなせれば、タップでのオブジェクト情報の取得や、銃で敵を打つなどができるようになります。
それでは早速、見ていきましょう!
Raycastとは?
Ray とは、直訳すると「光線」という意味です。
シーン上の指定した地点から光線を飛ばし、光線上にあるコライダーの情報を取得するのに用いられます。
その時に使用するのが、 Physics.Raycast() です。
戻り値は bool 型で、Ray がコライダーにヒットした場合は「true」、それ以外は「false」を返します。
Physics.Raycast()
ここで関数の説明をします。
1 | Raycast(Vector3 origin, Vector3 direction, RaycastHit hitInfo, float maxDistance) |
origin は Ray の開始地点(ワールド座標)、direction は Ray を飛ばす方向です。
origin と direction は、必ず与えなければいけません。
hitInfo は、Ray が当たったコライダーを持つオブジェクトの情報で、オブジェクトの情報を取得したい場合に使用します。
maxDistance は、Ray が衝突を検知する最大の距離で、与えなかった場合は Ray は無限に続きます。
Rayを飛ばしてみよう!
次は、実際に Ray を飛ばして、当たり判定をしてみましょう。
準備として、シーン上に球とキューブを、1つずつ設置してください。
ここでは、分かりやすいように、球の真上にキューブを設置しましょう。
コライダーがアタッチされているのかも、忘れずに確認してください。
以下のコードは、スペースボタンを押すと球からキューブに Ray が飛ばされ、当たったらキューブを消滅させるサンプルコードです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | using UnityEngine; public class RaycastTester : MonoBehaviour { private void FixedUpdate() { if (Input.GetKey(KeyCode.Space)) { RaycastHit hit; if(Physics.Raycast(gameObject.transform.position,Vector3.up,out hit, 6.0f)) { Destroy(hit.collider.gameObject); } } } } |
スクリプトは、球にアタッチしてください。
Rayを可視化させる
次は、上で飛ばした Ray を、可視化させてみましょう!
可視化には、 Debug.DrawRay() を使用します
1 | Debug.DrawRay(Vector3 origin, Vector3 dir, Color color, float duration) |
それぞれの意味は、次のとおり。
- origin:Ray の開始地点
- dir:Ray の方向と長さ
- color:Ray の色
- duration:Ray を表示する時間(秒)
以下は、サンプルコードです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | using UnityEngine; public class RaycastTester : MonoBehaviour { private void FixedUpdate() { if (Input.GetKey(KeyCode.Space)) { RaycastHit hit; //以下1行追加しました Debug.DrawRay(gameObject.transform.position, Vector3.up * 6, Color.blue, 0.1f); if(Physics.Raycast(gameObject.transform.position,Vector3.up,out hit, 6.0f)) { Destroy(hit.collider.gameObject); } } } } |
Ray の形を変えてみよう!
これまでに紹介してきたのは、最も一般的な線形の Ray です。
ここでは、様々な形の Ray を紹介していきます。
SphereCast
SphereCast() は、球形の Ray を飛ばして、当たり判定をする関数です
1 | SphereCast(Vector3 origin, float radius, Vector3 direction, out RaycastHit hitInfo, float maxDistance) |
radius には、球の半径を与えます。
それ以外の引数は、 Raycast() と同様です。
以下は、サンプルコードです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | using UnityEngine; public class RaycastTester : MonoBehaviour { private void FixedUpdate() { if (Input.GetKey(KeyCode.Space)) { RaycastHit hit; if(Physics.SphereCast(gameObject.transform.position,0.5f,Vector3.up,out hit, 6.0f)) { Destroy(hit.collider.gameObject); } } } } |
BoxCast
BoxCast() は、キューブ型の Ray を飛ばして当たり判定をする関数です。
1 | BoxCast(Vector3 center, Vector3 halfSize, Vector3 direction, out RaycastHit hitInfo, Quaternion orientation, float maxDistance) |
それぞれの意味は、次のとおり。
- center:ボックスの中心の座標です。
- halfSize:実際のボックスの半分のサイズを与える引数
- orientation:ボックスの回転を与える引数
例えば、サイズが Vector3( 1, 1, 1) のボックスを作る際は、 Vector3( 0.5f, 0.5f, 0.5f) を与えます。
ボックスの中心から、各面への距離だと考えると分かりやすいかも知れません。
残りの3つは、Raycast と同じにものになります。
以下は、サンプルコードです。
今回は、キューブ型ですので、キューブの方にアタッチしましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | using UnityEngine; public class RaycastTester : MonoBehaviour { private void FixedUpdate() { if (Input.GetKey(KeyCode.Space)) { RaycastHit hit; if(Physics.BoxCast(gameObject.transform.position,Vector3.one * 0.5f, -Vector3.up, out hit, gameObject.transform.rotation, 6.0f)) { Destroy(hit.collider.gameObject); } } } } |
CapsuleCast
CapsuleCast() は、カプセル型の Ray を飛ばして、当たり判定をする関数です。
1 | CapsuleCast(Vector3 point1, Vector3 point2, float radius, Vector3 direction, out RaycastHit hitInfo, float maxDistance) |
「point1」「point2」は、カプセルの両端の円の中心の座標で、「radius」はその半径です。

残りの3つは、Raycast と同じです。
以下はサンプルコードです。
Sphere の代わりに Capsule を生成して、Capsule にスクリプトをアタッチしましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | using UnityEngine; public class RaycastTester : MonoBehaviour { private void FixedUpdate() { if (Input.GetKey(KeyCode.Space)) { RaycastHit hit; Vector3 point1 = gameObject.transform.position - Vector3.up * 0.5f;//0.5掛けることでCapsuleと同じ大きさのRayにする Vector3 point2 = gameObject.transform.position + Vector3.up * 0.5f; if(Physics.CapsuleCast(point1, point2,0.5f, Vector3.up, out hit, 6.0f)) { Destroy(hit.collider.gameObject); } } } } |
さいごに
Raycast は、とても便利な機能です。
今回紹介できなかった機能も、まだたくさんあります。
ある程度の理解が進んだら、ぜひ調べてみてくださいね!
こちらの記事もオススメ!
書いた人はこんな人

- 「好きを仕事にするエンジニア集団」の(株)ライトコードです!
ライトコードは、福岡、東京、大阪の3拠点で事業展開するIT企業です。
現在は、国内を代表する大手IT企業を取引先にもち、ITシステムの受託事業が中心。
いずれも直取引で、月間PV数1億を超えるWebサービスのシステム開発・運営、インフラの構築・運用に携わっています。
システム開発依頼・お見積もり大歓迎!
また、現在「WEBエンジニア」「モバイルエンジニア」「営業」「WEBデザイナー」「WEBディレクター」を積極採用中です!
インターンや新卒採用も行っております。
以下よりご応募をお待ちしております!
https://rightcode.co.jp/recruit
ライトコードの日常12月 1, 2023ライトコードクエスト〜東京オフィス歴史編〜
ITエンタメ10月 13, 2023Netflixの成功はレコメンドエンジン?
ライトコードの日常8月 30, 2023退職者の最終出社日に密着してみた!
ITエンタメ8月 3, 2023世界初の量産型ポータブルコンピュータを開発したのに倒産!?アダム・オズボーン