【Unity】Raycastの使い方~Rayを飛ばして形も変化させてみよう!~
エンジニアになろう!
UnityでRaycastを使いこなそう!

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

残りの3つは、Raycast と同じです。
以下はサンプルコードです。
Sphere の代わりに Capsule を生成して、Capsule にスクリプトをアタッチしましょう。
1using UnityEngine;
2
3public class RaycastTester : MonoBehaviour
4{
5 private void FixedUpdate()
6 {
7 if (Input.GetKey(KeyCode.Space))
8 {
9 RaycastHit hit;
10 Vector3 point1 = gameObject.transform.position - Vector3.up * 0.5f;//0.5掛けることでCapsuleと同じ大きさのRayにする
11 Vector3 point2 = gameObject.transform.position + Vector3.up * 0.5f;
12
13 if(Physics.CapsuleCast(point1, point2,0.5f, Vector3.up, out hit, 6.0f))
14 {
15 Destroy(hit.collider.gameObject);
16 }
17 }
18 }
19}さいごに
Raycast は、とても便利な機能です。
今回紹介できなかった機能も、まだたくさんあります。
ある程度の理解が進んだら、ぜひ調べてみてくださいね!
こちらの記事もオススメ!
ライトコードでは、エンジニアを積極採用中!
ライトコードでは、エンジニアを積極採用しています!社長と一杯しながらお話しする機会もご用意しております。そのほかカジュアル面談等もございますので、くわしくは採用情報をご確認ください。
採用情報へ
「好きを仕事にするエンジニア集団」の(株)ライトコードです! ライトコードは、福岡、東京、大阪、名古屋の4拠点で事業展開するIT企業です。 現在は、国内を代表する大手IT企業を取引先にもち、ITシステムの受託事業が中心。 いずれも直取引で、月間PV数1億を超えるWebサービスのシステム開発・運営、インフラの構築・運用に携わっています。 システム開発依頼・お見積もり大歓迎! また、現在「WEBエンジニア」「モバイルエンジニア」「営業」「WEBデザイナー」を積極採用中です! インターンや新卒採用も行っております。 以下よりご応募をお待ちしております! https://rightcode.co.jp/recruit







