【Unity】DrawRayとは?透明のRayをゲーム内に表示してくれるメソッド

DrawRayとは? Unity

こんにちは、ともくんのゲーム作り部屋にようこそ!

このページでは、

「DrawRayメソッドってどういうもの?」

「Rayの光線を見えるようにしたいけど、やり方がわからない。」

というお悩みの方に向けた内容となっています。

Unityでは、Rayという構造体を使って、ゲーム内で一直線に進む光線を作り出すことができます。

しかし、このRayというのは透明で見えないため、想定した向きや場所に向かって光線がちゃんと飛んでいるのかどうかは、画面を見ただけでは分かりません。

この透明なRayに色を付けて画面内で見えるようにして、想定した光線となっているのかどうかを確認できるのが、DrawRayというメソッドになっています。

そこで、このページでは、UnityのDrawRayメソッドについて、どんなメソッドなのか、また使い方までをまとめていきます。

この記事を書いた人

ゲーム作りを学び始めた一児のパパです。
このブログは、子供から「ゲームを作ってみたい!」と言われ、非プログラマーでゲーム作りをしたことない僕が、ゲーム作りの本を読んで独学でゲーム開発を学んでいるブログです。
同じように初めてゲーム作りをしている方と一緒に学んでいけるようなブログに出来たらいいなと思っています。
また、「このコードはおかしい」とか「もっと良い書き方があるよ!」などあれば、どんどん指摘して頂けると助かります。

DrawRayとは?

まずは、DrawRayがどういうメソッドなのか、紹介していきます。

Rayをゲーム内に表示させるメソッド

DrawRayとは、冒頭でも解説した通りで、Rayという構造体で表されるまっすぐな光線を画面内に表示させるためのメソッドになっています。

そもそもRay構造体というのは、光線を飛ばす位置と方向を指定して光線を定義しているものとなっていて、実際に光線を飛ばす場合はRaycastメソッドなどを使います。

そして、光線を飛ばした先にコライダーの付いているオブジェクトがある場合は、当たり判定の処理を作ることができるようになっています。

しかし、この光線を飛ばす処理をUnityのスクリプトで実際に記述したとしても、光線自体は透明なものなので、ゲーム画面では本当に光線が想定した向きで飛ばされているかどうかを確認することができません。

この時に、DrawRayメソッドを使ってあげると、光線自体に色を付けることができるので、光線を飛ばした際、どのように進んでオブジェクトなどとの接触が起きているかが画面上で分かるようになります。

Unity上でしか表示できないので注意

このDrawRayメソッドは、Rayに色を付けることができるので非常に便利ですが、注意点としてUnity上でしか表示することができません。

例えば、先ほどと同じくゲーム内で飛ばした光線にDrawRayメソッドで、以下のように色を付けていたとします。

Unityのエディター上では問題なく表示されていますが、実際にファイルとして書き出してみると、以下のように光線に付いていた色が表示されず、透明に戻っているのが分かります。

実は、DrawRayメソッドはDebugクラスで定義されているメソッドのため、デバッグ環境であるUnity上でしか表示することができないメソッドになっています。

そのため、DrawRayメソッドは、あくまでも光線が指定した方向にしっかりと飛んでいるのかどうかをチェックするために使うものであり、もし実機でも光線に色を付けて見せるようにするのであれば、別の方法で設定しておく必要があります。

DrawRayの使い方

ここからは、実際にDrawRayメソッドの使い方を紹介していきます。

引数でRayの情報や表示させる色を指定して使う

DrawRayメソッドでRayを可視化させる場合は、以下のように引数にRayの情報や色を指定して記述してあげます。

Debug.DrawRay(start, dir, color);

start:光線を開始する位置(Vector3型)
dir:光線の向きと長さ(Vector3型)
color:光線を表示させたい色(Color型)

第一引数に、光線を表示させる開始地点Vector3型で指定してあげます。

第二引数には、光線を飛ばす向きと長さVector3型で指定します。

そして、第三引数で光線を表示させる色Color型で指定し、省略した場合は「Color.white」と同じになり白色の線で表示されるようになります。

Raycastで飛ばしたRayを表示させる処理

実際に、DrawRayメソッドを使って光線を画面に表示させる処理を作ってみます。

ここでは、スペースキーを押している間、以下の青色のオブジェクトから赤色のオブジェクトに向かって光線を飛ばし、赤色のオブジェクトが青色に変化するという処理を作っていきます。

空オブジェクトを作成して、以下のスクリプトをアタッチしておきます。

using UnityEngine;

public class Test : MonoBehaviour
{
    public GameObject blueObj;  // 青色のオブジェクトの変数
    public GameObject redObj;   // 赤色のオブジェクトの変数
    Renderer rend;

    Vector3 start;  // 光線の開始地点
    Vector3 dir;    // 光線の方向ベクトル

    void Start()
    {
        start = blueObj.transform.position; // 青色のオブジェクトの座標を開始地点に代入
        dir = redObj.transform.position - blueObj.transform.position;   // 赤色と青色のオブジェクトの差を方向ベクトルに代入
        rend = redObj.GetComponent<Renderer>();
    }

    void Update()
    {
        // スペースキーを押した場合
        if (Input.GetKey(KeyCode.Space))
        {
            Debug.DrawRay(start, dir, Color.blue);  // 青色の光線が表示される処理

            // 光線がオブジェクトに当たっている場合
            if (Physics.Raycast(start,dir))
            {
                rend.material.color = Color.blue;   // 青色に変更する処理
            }
        }

        // スペースキーを離した場合
        else if (Input.GetKeyUp(KeyCode.Space))
        {
            rend.material.color = Color.red;    // 赤色に変更する処理
        }
    }
}

まず、Rayを飛ばす処理として、スペースキーを押した際の27行目でRaycastメソッドを使っていて、開始地点を青色のオブジェクト、飛ばす方向を赤色から青色を引いた方向ベクトルで指定しています。

29行目に、光線が当たった際の処理として、赤色のオブジェクトを青色に変化させる処理を行っていて、スペースキーを離して当たらなくなった場合は、36行目で赤色に戻す処理を記述しています。

そして、このスペースキーを押した中の24行目でDrawRayメソッドを記述していて、Raycastで指定したのと同じく開始地点を青色のオブジェクト、光線の飛ばす方向と長さを赤色から青色を引いた方向ベクトル、そして光線の色を青色にしています。

これでゲームを実行してみると、

青色のオブジェクトから赤色に向かって、青い光線が表示されるようになり、スペースキーを離すと青い光線が無くなり、オブジェクトの色も赤色に戻っているのが分かります。

なお、ゲームウィンドウでDrawRayによる線が表示されていない場合は、画面の右上にある「Gizmos」をクリックしてあげることで、表示されるようになります。

まとめ

このページでは、Unityで使えるDrawRayメソッドについて、どんなメソッドなのか、また使い方までをまとめていきましたが、いかがでしたでしょうか?

DrawRayメソッドとは、Raycastで飛ばした透明のRayに対して、色を付けて可視化することができるメソッドです。

Unity上でのみ表示することができますが、想定した方向に光線が飛んでいるかどうかを確認することができるので便利です。

ただし、ゲームを書き出したり、実機で確認した場合は表示されないため、注意しておきましょう。

最後までお読みいただきまして、ありがとうございました!

コメント