【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 は、とても便利な機能です。
今回紹介できなかった機能も、まだたくさんあります。
ある程度の理解が進んだら、ぜひ調べてみてくださいね!
こちらの記事もオススメ!
2020.07.17ライトコード的「やってみた!」シリーズ「やってみた!」を集めました!(株)ライトコードが今まで作ってきた「やってみた!」記事を集めてみました!※作成日が新し...
2020.07.28Unity 特集知識編おすすめのゲームエンジン5選実装編※最新記事順に並べています。VR環境でテキストを表示する方法非同期式の入れ子処...
ライトコードでは、エンジニアを積極採用中!
ライトコードでは、エンジニアを積極採用しています!社長と一杯しながらお話しする機会もご用意しております。そのほかカジュアル面談等もございますので、くわしくは採用情報をご確認ください。
採用情報へ
「好きを仕事にするエンジニア集団」の(株)ライトコードです! ライトコードは、福岡、東京、大阪、名古屋の4拠点で事業展開するIT企業です。 現在は、国内を代表する大手IT企業を取引先にもち、ITシステムの受託事業が中心。 いずれも直取引で、月間PV数1億を超えるWebサービスのシステム開発・運営、インフラの構築・運用に携わっています。 システム開発依頼・お見積もり大歓迎! また、現在「WEBエンジニア」「モバイルエンジニア」「営業」「WEBデザイナー」を積極採用中です! インターンや新卒採用も行っております。 以下よりご応募をお待ちしております! https://rightcode.co.jp/recruit