• トップ
  • ブログ一覧
  • 【Unity】Raycastの使い方~Rayを飛ばして形も変化させてみよう!~
  • 【Unity】Raycastの使い方~Rayを飛ばして形も変化させてみよう!~

    メディアチームメディアチーム
    2021.09.15

    エンジニアになろう!

    【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)

    それぞれの意味は、次のとおり。

    1. origin:Ray の開始地点
    2. dir:Ray の方向と長さ
    3. color:Ray の色
    4. 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)

    それぞれの意味は、次のとおり。

    1. center:ボックスの中心の座標です。
    2. halfSize:実際のボックスの半分のサイズを与える引数
    3. 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」はその半径です。

    「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 は、とても便利な機能です。

    今回紹介できなかった機能も、まだたくさんあります。

    ある程度の理解が進んだら、ぜひ調べてみてくださいね!

    こちらの記事もオススメ!

    featureImg2020.07.17ライトコード的「やってみた!」シリーズ「やってみた!」を集めました!(株)ライトコードが今まで作ってきた「やってみた!」記事を集めてみました!※作成日が新し...
    featureImg2020.07.28Unity 特集知識編おすすめのゲームエンジン5選実装編※最新記事順に並べています。VR環境でテキストを表示する方法非同期式の入れ子処...

    ライトコードでは、エンジニアを積極採用中!

    ライトコードでは、エンジニアを積極採用しています!社長と一杯しながらお話しする機会もご用意しております。そのほかカジュアル面談等もございますので、くわしくは採用情報をご確認ください。

    採用情報へ

    メディアチーム
    メディアチーム
    Show more...

    おすすめ記事

    エンジニア大募集中!

    ライトコードでは、エンジニアを積極採用中です。

    特に、WEBエンジニアとモバイルエンジニアは是非ご応募お待ちしております!

    また、フリーランスエンジニア様も大募集中です。

    background