藍と淡々

物作り冒険譚


【Unity】Rayの使い方まとめ

こんにちは!

今回はUnityでよく使うRayについてまとめてみようと思います。

基本的な使い方から、可視化、太さの変更など、参考になれば幸いです⁽⁽◞(꒪ͦᴗ̵̍꒪ͦ=͟͟͞͞ ꒪ͦᴗ̵̍꒪ͦ)◟⁾⁾

 

===================

この記事を書いた時のバージョン(Mac

・Unity PersonalEdition 5.1.2f1 

===================

 

今回の内容をGistにまとめました。上から紹介していきます。

RayTest

 

1. Rayの作成

ーーーーーーーーーーーーーーーーーーーーーー

Ray(①Vector3 origin, ②Vector3 direction)

①・・・Rayの発生地点

②・・・Rayの進む方向

ーーーーーーーーーーーーーーーーーーーーーー

マウスのクリックでオブジェクトの選択をしたいときなんかは、ScreenPointToRayが使えます。

Gameビュー上のマウスの位置からRayを発射することができるようになります。

 

2. Physics.Raycastで衝突判定

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

Physics.Raycast(①Ray ray, ②out RaycasatHit hitInfo, ③float maxDistance, ④int layerMask) 

①・・・どのRayについて判定するか

②・・・RaycastHitに格納されている衝突したオブジェクトの情報を得る

③・・・Rayの長さ(何も指定しないと、Mathf.Infinity(無限)になる)

④・・・Rayが衝突するレイヤー(何も指定しないと、「Ignore Raycast」レイヤー以外が判定対象レイヤーになる)

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

衝突判定を行いたいオブジェクトにはColliderをアタッチしておきましょう。

②ではout修飾子を付けるのを忘れずに(ؓؒؒؑؑؖؔؓؒؐؐ⁼̴̀ωؘؙؖؕؔؓؒؑؐؕ⁼̴̀ ) 

上のサンプルコードでは、衝突したオブジェクトのコンポーネントを得たり、衝突地点の情報を得たりする方法を載せておきました。

また、レイヤーについてですが、何も指定しなければ「Ignore Raycast」レイヤー以外のすべてのレイヤーが選択されるので、もしRayの対象範囲から外したいオブジェクトがある場合には、そのオブジェクトのレイヤーを「Ignore Raycast」にしてあげるといいでしょう。

f:id:MegumiSoft:20150813164025p:plain

これでRayの対象範囲から除外されます。 

特定のレイヤーだけをRayの対象にしたい場合、上のコードの冒頭に書いたように、PublicでInspectorから直接レイヤーを指定するのが一番簡単だと思います。

f:id:MegumiSoft:20150813164221p:plain

 

3. RaycastAll

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

Physics.RaycastAll(Ray ray, float maxDistance, int layerMask)

*引数はRaycastと同じ

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

これは放ったRayが衝突した全てのオブジェクトの情報を得ることができます。

正直実際に使ったことはないんですが、こんなのもあるよといった感じの紹介‹‹\(´ω` )/›› ‹‹\(  ´)/›› ‹‹\( ´ω`)/››

サンプルコードでは、衝突したオブジェクトのタグが"Red"なら赤色に変え、"Blue"なら青色に変え・・・といった役に立つかわからない処理を書いときました。。

 

4. Rayの太さを変える

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

Physics.SphereCast(Ray ray, ①float radius, out RaycastHit hit, float maxDistance, int layerMask)

①・・・Rayの半径の指定

*他の引数はRaycastと同じ

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

Raycastではなく、SphereCastを使うことで、ラインの選択範囲を変更できます。

まだ使ったことはないけど、便利かも?

これにも、衝突した全てのオブジェクトの情報を得るSphereCastAllがありますʕ•̫͡•ʕ*̫͡*ʕ•͓͡•ʔ-̫͡-ʕ•̫͡•ʔ*̫͡*ʔ-̫͡-ʔ

(他にもCapsulCastなんてのもありますが、使わなそうなので割愛)

 

5. Rayの可視化

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

Debug.DrawRay(①Vector3 start, ②Vector3 dir, ③Color color, ④float duration, ⑤bool depthTest);

①・・・開始地点。Ray.originでRayの開始地点を得られる

②・・・方向と長さ。Ray.directionで得られる

③・・・可視化したときの色。(何も指定しなければ、Color.white)

④・・・表示時間(何も指定しなければ、0.0fになる(ワンフレームだけ描写))

⑤・・・ラインがオブジェクトで隠れた場合、ラインを隠すかどうか(何も指定しなければ、true)

 ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

 これはデバッグなのでGameビューでは可視化されず、Sceneビューでのみ確認できます。

②については、可視化できたには良いけど短い、といった場合には「* 10」とかしてあげてください。(意外と盲点?自分だけかも・・・)

⑤はちょっとわかりにくいので、GIFを用意しました。

f:id:MegumiSoft:20150813165702g:plain

こんな違いがありますが、普通使う分にはtrueの方が便利かと思うので、⑤の引数には何も指定しなくて良いと思います。 

 

6. マウスがUIを選択しているかどうか

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

UnityEngine.EventSystems.EventSystem.current.IsPointerOverGameObject();

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

これは直接Rayに関係するわけではありませんが、知っておくと便利な機能です。

例えばGameビュー上で左クリックしたらRayを発射して、衝突したオブジェクトを消す、といった処理を実装したいときに、UIを左クリックしたら一緒にRayも誤射されてしまいます。

そのような、UI(EventSystem)の上にマウスがあるときはRayを発射しないようにしたい場合、これが役立ちます\\\\(۶•̀ᴗ•́)۶////

 

 

さて、Rayについてのまとめはこれで終わりですが、お悩みの問題は解決しましたでしょうか。

もし解決しなかった場合、探していたRayに関する情報が抜けていた場合などは気軽にご質問ください⁽⁽٩(๑˃̶͈̀ ᗨ ˂̶͈́)۶⁾⁾ 

自分も初心者ですが、わかる範囲で調べてお答えします。。☭(;´༎ຶД༎ຶ`)☭ワカルトイイケド...