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

(:3[kanのメモ帳]

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

RayCastその4、Raycastを2Dで使う【Unity】


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

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


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


はじめに

RayCastシリーズ、前回はRayを画面に表示する記事でした。




4回目の今回はRaycastを2Dで使う方法についてです。


Physics2D.Raycast

UnityではBoxColliderとBoxCollider2Dのように3Dと2Dではコライダーが別にあり、

違う次元のコライダーが衝突する事はありません


Raycastも同様で、Physics.Raycastは2D用のコライダーには衝突しません

なので、2Dの時はPhysics2D.Raycastを使います。

実際に使ってみると以下の通り、


f:id:kan_kikuchi:20150729073436g:plain

void Update () {

  //メインカメラ上のマウスカーソルのある位置からRayを飛ばす
  Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);

  //レイヤーマスク作成
  int layerMask = LayerMaskNo.DEFAULT;

  //Rayの長さ
  float maxDistance = 10;

  RaycastHit2D hit = Physics2D.Raycast((Vector2)ray.origin, (Vector2)ray.direction, maxDistance, layerMask);
  
  //なにかと衝突した時だけそのオブジェクトの名前をログに出す
  if(hit.collider){
    Debug.Log(hit.collider.gameObject.name);
  }

}


3Dの時と同様に

カーソルの位置からRayを飛ばし、カーソルの位置にあるオブジェクト名をログで出力しています。


なお、オブジェクト名がそれぞれBearとFoxで、

両オブジェクトともBoxCollider2Dがついており、レイヤーはDefaultになっています。


f:id:kan_kikuchi:20150729074239p:plain


レイヤーの件はその2をご参照の事。

だいたい3Dの時と同じですが、いくつか違う点もあります。


3Dとの相違点

Rayを引数に出来ない

3Dの時は開始位置とベクトルの代わりにRayを引数に出来ましたが、

2Dでは出来ないようです。

なお、distanceやlayerMaskの省略は2Dでも行えます。


Depth

続いても引数の話ですが、2DではlayerMaskの後にDepthのminとmaxを設定出来ます。

設定したDepth内のオブジェクトにしか衝突しないという事ですね。

Physics2D.Raycast(origin, direction, maxDistance, layerMask, minDepth, maxDepth);


2DのDepthというので、SortingLayerやOrderの事かと思い気や、なんとZ座標の事でした。

これの使い道はよく分かりません……


返り値とHitの受け取り

一番の相違点だと思うのがこの返り値です。

3Dだと返り値は衝突したかどうかのbool値で、

衝突した場合の情報を受け取るためRaycastHitを参照渡し、というやり方でした。


2Dだと返り値自体がRaycastHit2Dとなっているため、

かなり分かり易くなった気がします。


なお、衝突していない場合はRaycastHit2Dのcolliderがnullなのでそこで判定できます。


2Dでも線を引く

その3でRaycastとDrawRayを同時に行うメソッドというのを作りましたが、

それの2Dバージョンも作ってみました。と言ってもほぼ同じですが。



使い方は以下の通り。

RaycastHit2D hit = Physics2DExtentsion.RaycastAndDraw((Vector2)ray.origin, (Vector2)ray.direction, maxDistance, layerMask);


使用イメージはこんな感じ、


f:id:kan_kikuchi:20150729214025g:plain


カメラからのRayを表示しても2Dだとほぼ見えないので、

熊から狐に向かってRayを飛ばしてみました。


NGUI

余談なのですが、約2年前の記事で

NGUIで表示しているジョイスティックに、Rayを当てようとして断念したらしいです。



ついでなので、この時に失敗した原因を言うと

RayをGUIを表示しているカメラでは無く、メインのカメラから飛ばしていた事です。

GUIを表示しているカメラからRayを飛ばせばもちろん衝突させる事が出来ます。


なお、NGUIは表示こそ2Dですがコライダーは3Dなので、

Physics2D.Raycastでは無く、Physics.Raycastを使います。


おわりに

今回でRayCastシリーズ終了です!

それでは良いRayCastライフを〜(:3っ)∋〜