【Unity】Raycastとは?Rayを飛ばして当たり判定を検知するメソッド

Raycastとは? Unity

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

このページでは、

「Raycastメソッドってなに?」

「Raycastメソッドってどうやって使うの?」

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

Unityでは、マウスカーソルやスマホでのタップ操作の際に、Raycastメソッドがよく使われます。

このRaycastメソッドとは、光線(Ray)をシーン内で飛ばして、その線上にあるコライダーの付いているオブジェクトとの当たり判定を検知することができるメソッドです。

例えば、マウスでクリックしたゲームオブジェクトに対して処理を行ったり、銃のオブジェクトから光線を飛ばしてその先のオブジェクトを消去する、といった処理をRaycastメソッドで作ることができます。

そこで、このページでは、Unityで使えるRaycastメソッドについて、どんなメソッドなのか、仕組みや使い方までをまとめていきます。

この記事を書いた人

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

Raycastメソッドとは?

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

光線を飛ばし他のオブジェクトとの当たり判定を行う

Raycastメソッドとは、ゲームシーン内で光線となるRayを飛ばして、当たり判定を検知するPhysicsで定義されているメソッドです。

もう少し詳しく説明すると、特定の位置から指定した方向に向かって真っ直ぐに進む光線(Ray)を飛ばし、この線上にコライダーを付けているオブジェクトがあるかないかをbool型(trueかfalse)で返すメソッドです。

また、当たり判定があった場合は、その光線が最初に衝突したオブジェクトの情報をRaycastメソッドで取得することができます。

例えば、マウスカーソルの位置から画面の奥に向かう光線を飛ばしてあげることで、マウス操作でオブジェクトに対しての処理をRaycastメソッドで作ることができるようになります。

線以外の形状で飛ばすこともできる

Raycastメソッドは光線を飛ばすので、細い線の形状で当たり判定を行うことになりますが、この形状を変更して飛ばすメソッドもあります。

それが、以下の3つのメソッドになります。

  • BoxCast:キューブの形状で飛ばす
  • SphereCast:球体の形状で飛ばす
  • CapsuleCast:カプセル型の形状で飛ばす

それぞれ位置や方向だけでなく、形状の大きさなどを指定した形で飛ばすことができます。

なお、どのメソッドもRaycastと同じく当たり判定を検知することができるので、光線だと細すぎて上手く当たり判定を検知できない場合や、特定の形の範囲だけ当たり判定を取りたい時などに、これらのメソッドを使うようにしましょう。

Raycastメソッドの使い方

ここからは、実際にUnity内でRaycastメソッドの使い方について紹介していきます。

引数で光線の情報を指定して使う

Raycastメソッドを使う際は、

Physics.Raycast(Vector3 origin, Vector3 direction, RaycastHit hitInfo, float maxDistance)

もしくは、

Physics.Raycast(Ray ray, RaycastHit hitInfo, float maxDistance)

といった形で、引数に光線の情報や当たり判定のあったオブジェクト情報を設定していくことになります。

この引数の中で必ず必要になるのが「origin」「direction」の2つで、「origin」光線を飛ばし始める位置をVector3型で指定し、「direction」光線を飛ばす方向をVector3型で指定します。

また、Raycastで飛ばす光線は、Ray構造体というもので表すことができ、このRay構造体は光線を飛ばし始める位置(origin)と光線を飛ばす方向(direction)をメンバ変数で持っているので、originとdirectionを直接指定する代わりに「Ray ray」とRay構造体で記述することもできます。

「hitInfo」は、光線で当たったオブジェクトの情報を取得するためのもので、当たったオブジェクト情報がいらない場合は省略することができます。

そして、「maxDistance」は光線の長さ、つまりオブジェクトとの当たり判定を検知する最大の距離をfloat型で指定することができ、省略した場合は「Mathf.Infinity」と同じで無限の長さになります。

if文内でRaycastを使って当たり判定の処理を作る

Raycastメソッドは、オブジェクトと当たったかどうかがbool型で返ってくるので、if文の中で使って書いていきます。

ここでは、実際にゲームシーン内にコライダーを付けたオブジェクトをいくつか配置して、そのオブジェクトをマウスでクリックしたら消えるという処理を作ってみます。

空のオブジェクトを用意して、以下のスクリプトを紐づけていきます。

using UnityEngine;

public class Test : MonoBehaviour
{
    void Update()
    {
        // マウスをクリックした場合
        if (Input.GetMouseButton(0))
        {
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);    // カメラからマウスカーソルの位置のRayを作成
            RaycastHit hit;
            // Rayを飛ばして当たり判定をチェック
            if (Physics.Raycast(ray, out hit))
            {
                Destroy(hit.collider.gameObject);   // 当たり判定のあるオブジェクトの消去
            }
        }
    }
}

マウスをクリックした処理の中で、10行目でScreenPointToRayメソッドの引数に、マウスカーソルの位置を表すInput.mousePositionを指定し、Ray構造体を作っています。

PointToRayメソッドとは、カメラの位置(origin)から引数に指定したスクリーン座標に向かうベクトル(direction)Ray構造体で取得できる、Cameraコンポーネントで定義されているメソッドです。

このPointToRayメソッドの引数に、マウスカーソルの位置を表すInput.mousePositionを指定することで、カメラからマウスカーソルの位置に向かう光線(Ray)を作ることができます。

次に、先ほど作ったRayを飛ばすために、13行目でRaycastメソッドをif文内で記述してオブジェクトとの当たり判定を検知しています。

このRaycastメソッドの中で、outパラメーター修飾子を使って当たったオブジェクト情報を返すようにしています。

そして、その当たったオブジェクトが消えるように、Destroyメソッドで消去する処理を行っています。

実際に、ゲームを実行してみると、

上記のように、マウスの位置でクリックしたオブジェクトが消えているのが分かり、ちゃんと当たり判定の処理を作ることができました。

光線を可視化するならDebug.DrawRay

Raycastメソッドで飛ばす光線は透明で実際には見えませんが、開発環境下であれば可視化することができます。

光線を可視化する場合は、Debugクラスで定義されているDrawRayメソッドを使います。

DrawRayメソッドを使う場合は、いくつか書き方がありますが、

Debug.DrawRay(Vector3 start, Vector3 dir, Color color);

と、引数で「start」光線を可視化する位置「dir」光線の方向と長さ「color」色を指定することで、可視化することができます。

実際に、先ほど作ったスクリプトの光線を可視化してみます。

using UnityEngine;

public class Test : MonoBehaviour
{
    void Update()
    {
        if (Input.GetMouseButton(0))
        {
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            Debug.DrawRay(ray.origin, ray.direction * 50, Color.red);   // 赤色の光線で可視化する
            RaycastHit hit;
            if (Physics.Raycast(ray, out hit))
            {
                Destroy(hit.collider.gameObject);
            }
        }
    }
}

10行目でDrawRayメソッドで、Ray構造体のメンバ変数であるorigindirectionを使って、赤色の光線が表示されるように設定してみます。

すると、

マウスをクリックすると、赤色で光線を可視化することができました。

まとめ

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

Raycastメソッドとは、シーン内で透明な光線(Ray)を飛ばして、オブジェクトとの当たり判定を検知することができるメソッドです。

このRaycastメソッドを使うことで、ゲームオブジェクトに対してマウス操作やスマホでのタップ操作で処理を作ることができるようになります。

また、開発環境下であれば光線を可視化しながら、開発していくことができます。

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

コメント