【Unity】Rayの使い方まとめ
こんにちは!
今回はUnityでよく使うRayについてまとめてみようと思います。
基本的な使い方から、可視化、太さの変更など、参考になれば幸いです⁽⁽◞(꒪ͦᴗ̵̍꒪ͦ=͟͟͞͞ ꒪ͦᴗ̵̍꒪ͦ)◟⁾⁾
===================
この記事を書いた時のバージョン(Mac)
・Unity PersonalEdition 5.1.2f1
===================
今回の内容をGistにまとめました。上から紹介していきます。
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」にしてあげるといいでしょう。
これでRayの対象範囲から除外されます。
特定のレイヤーだけをRayの対象にしたい場合、上のコードの冒頭に書いたように、PublicでInspectorから直接レイヤーを指定するのが一番簡単だと思います。
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を用意しました。
こんな違いがありますが、普通使う分にはtrueの方が便利かと思うので、⑤の引数には何も指定しなくて良いと思います。
6. マウスがUIを選択しているかどうか
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
UnityEngine.EventSystems.EventSystem.current.IsPointerOverGameObject();
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
これは直接Rayに関係するわけではありませんが、知っておくと便利な機能です。
例えばGameビュー上で左クリックしたらRayを発射して、衝突したオブジェクトを消す、といった処理を実装したいときに、UIを左クリックしたら一緒にRayも誤射されてしまいます。
そのような、UI(EventSystem)の上にマウスがあるときはRayを発射しないようにしたい場合、これが役立ちます\\\\(۶•̀ᴗ•́)۶////
さて、Rayについてのまとめはこれで終わりですが、お悩みの問題は解決しましたでしょうか。
もし解決しなかった場合、探していたRayに関する情報が抜けていた場合などは気軽にご質問ください⁽⁽٩(๑˃̶͈̀ ᗨ ˂̶͈́)۶⁾⁾
自分も初心者ですが、わかる範囲で調べてお答えします。。☭(;´༎ຶД༎ຶ`)☭ワカルトイイケド...