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

(:3[kanのメモ帳]

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

RayCastその1、使い方【Unity】


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

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


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


はじめに

RayCastについてあれこれ書こうと思ったら、

予想以上に増えてしまったので、分けてお送りするシリーズでっす!全4回予定!


RayCastとは

ではまず、RayCastとはなんぞやという所から。

RayCastとは、

光線(Ray)を飛ばしその光線が衝突したオブジェクトの情報を取得する

と言ったモノです。


例えば以下のように使います。


f:id:kan_kikuchi:20150719184751g:plain

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

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

}


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

このように、マウスやタップ判定に使われる事が多いです。


ちなみにこのワンコ達のアセットはこちら


Rayの設定

Physics.RaycastでRayを飛ばす時に、Rayの設定をします。

引数の取り方は複数設定されていますが、



大きく分けて2パターン、1つ目はRayの発射位置と方向を指定するパターン

//startPointが発射位置、directionが発射方向。両方ともVector3
Physics.Raycast (startPoint, direction, out hit, Mathf.Infinity);


2つ目は上記の例でもあった直接Rayを使ったパターン

Physics.Raycast(ray, out hit, Mathf.Infinity);


こちらは発射位置と方向がrayに設定されています。


また双方とも、衝突したオブジェクトの情報を取得するためhitを参照渡しで渡し、

Mathf.InfinityでRayの長さを最大に指定しています。


取得できる情報

Rayを発射する時に参照渡した RaycastHit の hit に衝突したオブジェクトの情報が入っています。

上記の例でも hit.collider.gameObject.name でオブジェクト名を取得しています。


他にも原点からの距離や衝突した面の角度などが取得できます。

詳しくは下記を参照の事。



よく使うのは例と同じく、衝突した GameObject を取得する事ですかね。


コライダー

Rayはコライダーに当たってオブジェクトを検知するので、

検知したいオブジェクトにはコライダーが必須です。


f:id:kan_kikuchi:20150719191408p:plain


上記の画像のようにコライダーが設定されているオブジェクトの情報を持ってくるので、

子オブジェクトにコライダーが設定されていて、予想と違うオブジェクトに反応しちゃった!

みたいにならないように注意が必要です。


おわりに

とりあえず今回はこの辺で、何はなくともワンコ可愛いですね。

次回は衝突するオブジェクトの制限とかレイヤーマスクとかになると思います!