この記事でのバージョン
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を使います。
実際に使ってみると以下の通り、
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になっています。
レイヤーの件はその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);
使用イメージはこんな感じ、
カメラからのRayを表示しても2Dだとほぼ見えないので、
熊から狐に向かってRayを飛ばしてみました。
NGUI
余談なのですが、約2年前の記事で
NGUIで表示しているジョイスティックに、Rayを当てようとして断念したらしいです。
ついでなので、この時に失敗した原因を言うと
RayをGUIを表示しているカメラでは無く、メインのカメラから飛ばしていた事です。
GUIを表示しているカメラからRayを飛ばせばもちろん衝突させる事が出来ます。
なお、NGUIは表示こそ2Dですがコライダーは3Dなので、
Physics2D.Raycastでは無く、Physics.Raycastを使います。
おわりに
今回でRayCastシリーズ終了です!
それでは良いRayCastライフを〜(:3っ)∋〜