UnityのRaycast

Unity公式のLet's Try: Shooting with raycastsというチュートリアルをやっていたらRaycastという技術が出てきたのでRaycastについての自分なりのまとめです。
以下チュートリアル

unity3d.com

ざっくりと

RayとCastに分解して意味を考えてみます。
Ray:光線
Cast:放つ
つまり光線を放つことです。

概要

ちゃんとした概要です。
Rayとはゲーム上の空間で、ある地点からある方向へ引いた半直線です。 このRayという直線を瞬間的に引く事をRaycastと言います。
チュートリアルでは下記のような図が出てきますが、実際には地点A、地点Bといった指定ではなく、始点、方向を決めて半直線を引くようなイメージです。 f:id:TEAREitai:20171108230016p:plain (公式チュートリアルから引用)

RaycastすることによってRayに当たったり貫通したGameObjectの情報を取得することが出来ます。
この情報はRaycastHitというクラスのオブジェクトとして受け取れます。

具体的な使い方

まずRaycastで検知されてほしいGameObjectにColliderコンポーネントを付けます。
ColliderコンポーネントとはGameObject同士の衝突を検知するためのコンポーネントです。(多分格ゲーの当たり判定みたいなものだと思います。)
Raycastで放つRayがこのColliderに触れることでヒットしたことになります。

次にPhysics.Raycastメソッドを呼び出しましょう。

公式リファレンス:Unity - スクリプトリファレンス: Physics.Raycast
リファレンスには何個か種類がありますが、基本的には同じです。
引数originにRayの始点、directionに方向ベクトル、maxDistanceにRayの長さを渡します。
戻り値はRayがコライダーにヒットしたかどうかがBoolで返ってきます。
ヒットしたコライダーの情報を受け取りたい場合は引数hitInfoにRaycastHit型の変数の参照を渡し、ヒットしていた場合は渡した変数の中にRaycastHitオブジェクトが格納されています。

コードの例として以下のように使います

public class RaycastExample : MonoBehaviour
{
    public Missile missile;

    void FixedUpdate()
    {
        //Raycast型変数hitを宣言
        RaycastHit hit;
        
        //out修飾子を付けてhit変数の参照を渡す
        if (Physics.Raycast(transform.position, -Vector3.up, out hit))
        {
            //hit変数内のコライダー情報にアクセス        
            print("Found an object - distance: " + hit.distance);
        }
    }
}  

ちなみにPhysics.Raycastメソッドでは最初にヒットしたコライダー情報しか取得出来ませんが、
Physics.RaycastAllメソッドを使えばRayにヒットした全てのコライダー情報がRaycastHit型配列として取得出来ます。

Unity - スクリプトリファレンス: Physics.RaycastAll

最後に

公式チュートリアルFPSの銃撃の当たり判定として使っていたように、FPS視点でカーソルをあわせたオブジェクトの情報を取得するような状況で良く使う仕組みだと思います。 FPSゲーム以外でもプレイヤーの真下にRayを発射して接地判定を行ったりなどの使いみちもありそうですね!

こんな感じでこれから自分なりに調べたことをまとめたり、作ったゲームなんかの紹介を行っていけたら良いなと思います! よろしくお願いします!!!!