この記事でのバージョン
Unity 5.1.0f3 Personal
RayCastシリーズ
1.使い方
2.衝突するオブジェクトの制限
3.Rayを画面に表示
4.2Dで使う
はじめに
RayCastシリーズ、前回は衝突するオブジェクトの制限の記事でした。
3回目の今回はRayを画面に表示する方法についてです。
こんな感じで画面にRayを表示していきたいと思います。
Debug.DrawRay
今回、Rayを画面に表示する際にDebug.DrawRayを使います。
ワールド座標にて start (開始地点)から start + dir (開始地点+方向)までラインを描画します。
ということで、正確に言うと飛ばしたRayを画面に表示するのではなく、
Rayと同じ位置に線を描画するという形です。
ではさっそくコードを
private void Update () { //メインカメラ上のマウスカーソルのある位置からRayを飛ばす Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); RaycastHit hit; //レイヤーマスク作成 int layerMask = LayerMaskNo.CORGI + LayerMaskNo.SHIBA; //Rayの長さ float maxDistance = 10; if (Physics.Raycast(ray, out hit, maxDistance, layerMask)){ //Rayが当たるオブジェクトがあった場合はそのオブジェクト名をログに表示 Debug.Log(hit.collider.gameObject.name); } //Rayを画面に表示 Debug.DrawRay(ray.origin, ray.direction * maxDistance, Color.green, 5, false); }
第一回とほぼ同じコードですが、最後にDrawRayで画面上に線を引いています。
DrawRayの引数は以下の通りで、
Debug.DrawRay(線の始点, 線の方向と長さ, 線の色, 線を表示する時間, ラインがカメラから近いオブジェクトによって隠された場合にラインを隠すかどうか);
線の始点と線の方向をそれぞれ、ray.originとray.directionから取得しています。
また、Rayの長さをMathf.Infinityにすると表示されないので注意が必要です。
このコードで表示したがRayが以下の通りです。
簡単に表示できましたね……!
Gameビューに表示
Sceneビューには表示されているけど、Game ビューに表示されない!
という時はGameビューのGizmosを有効にしましょう。
これでGameビューでも確認できるようになります。
衝突時と非衝突時で線を分ける
Rayがオブジェクトと衝突した時とそうでない時で線の描画を変えると、
より分かりやすくなります。
if (Physics.Raycast(ray, out hit, maxDistance, layerMask)){ //衝突時のRayを画面に表示 Debug.DrawRay(ray.origin, hit.point - ray.origin, Color.blue, 10, false); } else{ //非衝突時のRayを画面に表示 Debug.DrawRay(ray.origin, ray.direction * maxDistance, Color.green, 10, false); }
上記のように衝突時は衝突したオブジェクトの位置であるhit.pointを使い、
衝突した所までの線を表示、さらに色も分けてると良いかと思います。
このコードで表示したがRayが以下の通りです。
青が衝突時、緑が非衝突時の線です。
RaycastAndDraw
RaycastするたびにDrawRayするのはめんどいなー
という事で、RaycastとDrawRayを同時に行うメソッドを
拡張クラス(?)に作りました。
使い方は以下の通りです。
if(PhysicsExtentsion.RaycastAndDraw(ray, out hit, maxDistance, layerMask)){ //Rayが当たるオブジェクトがあった場合はそのオブジェクト名をログに表示 Debug.Log(hit.collider.gameObject.name); }
これでコードもスッキリしますね!
おわりに
とりあえず今回はこの辺で、
次回はRayCastを2Dで使う、とかそんな感じになると思います!