読者です 読者をやめる 読者になる 読者になる

(:3[kanのメモ帳]

個人ゲーム開発者kan.kikuchiのメモ的技術ブログ。月木更新でUnity関連がメイン。

RayCastその3、Rayを画面に表示【Unity】

Unity

このエントリーをはてなブックマークに追加

この記事でのバージョン
Unity 5.1.0f3 Personal


RayCastシリーズ
1.使い方
2.衝突するオブジェクトの制限
3.Rayを画面に表示
4.2Dで使う


はじめに

RayCastシリーズ、前回は衝突するオブジェクトの制限の記事でした。



3回目の今回はRayを画面に表示する方法についてです。


f:id:kan_kikuchi:20150727071104p:plain


こんな感じで画面に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が以下の通りです。


f:id:kan_kikuchi:20150727073533p:plain


簡単に表示できましたね……!


Gameビューに表示

Sceneビューには表示されているけど、Game ビューに表示されない!

という時はGameビューのGizmosを有効にしましょう。


f:id:kan_kikuchi:20150727072444j:plain


これで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が以下の通りです。


f:id:kan_kikuchi:20150727071104p:plain


青が衝突時、緑が非衝突時の線です。


RaycastAndDraw

RaycastするたびにDrawRayするのはめんどいなー

という事で、RaycastとDrawRayを同時に行うメソッド

拡張クラス(?)に作りました。



使い方は以下の通りです。

if(PhysicsExtentsion.RaycastAndDraw(ray, out hit, maxDistance, layerMask)){
  //Rayが当たるオブジェクトがあった場合はそのオブジェクト名をログに表示
  Debug.Log(hit.collider.gameObject.name);
}


これでコードもスッキリしますね!


おわりに

とりあえず今回はこの辺で、

次回はRayCastを2Dで使う、とかそんな感じになると思います!