ひとりでのアプリ開発 - fineの備忘録 -

ひとりでアプリ開発をするなかで起こったことや学んだことを書き溜めていきます

Unity - Ray, Ray2D:Ray の概念と可視化の方法 -

初めに

 Ray は「光線」を意味します。本記事は Ray の概念や変数、可視化の方法についてまとめます。

Ray について

 Ray は光線のことです。原点 ( origin ) から、設定した方向に向けて光線 ( direction ) を飛ばすことができます。3Dの場合は Ray, 2Dの場合は Ray2D を使います。

変数 説明
origin Ray の原点
3D:Vector3, 2D:Vector2
direction Ray の方向
3D:Vector3, 2D:Vector2

※Ray2Dの場合、origin, direction はVector3 でも動くようです。Vector3 で統一しておいたほうが、下記の Debug.DrawRay をRay2D で使うとき、便利かもしれません。

docs.unity3d.com
docs.unity3d.com

Debug.DrawRay:デバッグ時に Ray を可視化する

 Ray は無色透明なため、見えません。Ray を編集画面上で可視化(正確には、Ray の上に線を描画している)するには、Debug.DrawRay を用います。

Debug.DrawRay(Vector3 start, Vector3 dir, Color color, float duration, bool depthTest);

引数 説明
start Ray の始点
dir Ray の方向, 長さを表すベクトル
color
duration 表示する時間(秒)
記述しない場合は1フレームのみ表示
depthTest Rayが他のオブジェクトと重なった時に隠すかどうか
記述しない場合はtrueになり、重なると隠す

docs.unity3d.com

使ってみた

 次のスクリプトを適当なオブジェクトにつけ、実行します。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class DebugRayScript : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
      Vector3 origin = new Vector3(0, 0, 0); // 原点
      Vector3 direction = new Vector3(1, 0, 0); // X軸方向を表すベクトル
      Ray ray = new Ray(origin, direction); // Rayを生成
      Debug.DrawRay(ray.origin, ray.direction * 30, Color.red, 5.0f); // 長さ30、赤色で5秒間可視化
    }
}

 シーンビューでは確認できますが、ゲームビューでも見えるようにするには、Gizmos を有効にする必要があります。


LineRenderer を使い、Ray を描画する

 Gizmos は編集やデバッグのための機能のため、Debug.DrawRay では実際のゲーム画面に Ray を描画することはできません。そこで、LineRenderer を使い、Ray を描画してみます。

 LineRenderer の説明は、下のリンク先をご覧ください。
fineworks-fine.hatenablog.com

 LineRenderer コンポーネントをゲームオブジェクトにつけます。

 LineRenderer をつけたオブジェクトに次のスクリプトをつけます。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class DebugRayScript : MonoBehaviour
{
    LineRenderer linerend;

    // Start is called before the first frame update
    void Start()
    {
      Vector3 origin = new Vector3(0, 0, 0); // 原点
      Vector3 direction = new Vector3(1, 0, 0); // X軸方向を表すベクトル
      Ray2D ray = new Ray2D(origin, direction); // Rayを生成
      Debug.DrawRay(ray.origin, ray.direction * 30, Color.red, 5.0f); // 長さ30、赤色で5秒間可視化

      //Lineを描画する関数
      DrawRayLine(ray.origin, ray.direction * 30);
    }

    //引数はorigin(始点)と方向(direction)
    private void DrawRayLine(Vector3 start, Vector3 direction)
    {
      //LineRendererコンポーネントの取得
      linerend = this.GetComponent<LineRenderer>();

      //線の太さを設定
      linerend.startWidth = 0.04f;
      linerend.endWidth = 0.04f;

      //始点, 終点を設定し, 描画
      linerend.SetPosition(0, start);
      linerend.SetPosition(1, start + direction);
    }
}

(実行結果)
 Ray のある部分に線が描画できました。

Raycaster とは

 Raycaster とは、Ray(光線)をcast(投射)したとき、Ray になにかがぶつかったことを検出する仕組みです。クリックした場所から Ray を飛ばすことで、クリックした場所にあるオブジェクトを取得することができます。

docs.unity3d.com

最後に

 Ray についてまとめました。FPS を作ったり、Raycaster を使ってクリックを検出したり使う場面は多いように感じます。