Unity - Ray, Ray2D:Ray の概念と可視化の方法 -
初めに
Ray は「光線」を意味します。本記事は Ray の概念や変数、可視化の方法についてまとめます。
Index
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 で使うとき、便利かもしれません。
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になり、重なると隠す |
使ってみた
次のスクリプトを適当なオブジェクトにつけ、実行します。
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 を飛ばすことで、クリックした場所にあるオブジェクトを取得することができます。
最後に
Ray についてまとめました。FPS を作ったり、Raycaster を使ってクリックを検出したり使う場面は多いように感じます。