Unityでゲームを作っていると、離れた場所にあるコライダーを検出したくなる場面がよくあります。このような場合は「Raycast(レイキャスト)」と呼ばれるUnityの標準機能を使うと簡単に実現できるのですが、Raycastは目に見えないので初心者の方からしたら
- そもそも使い方がよく分からないんだけど…
- ちゃんと動作しているのかが分かりづらいなぁ
- なんか検出結果がおかしいぞ
といった悩みがつきものなのではないでしょうか。
そこでここでは
- そもそもRaycastとは何か?
- Raycastを可視化する方法
- Raycast系関数の使い方
といったことについてご説明しますね。
Raycast(レイキャスト)とは?
まずはじめに「Raycastとは何か?」という部分から簡単に説明しておきます。Raycastは簡単に言うと、
というセンサーのような機能です。これを使えば、あるゲームオブジェクトが(直接衝突することなく)その先にあるコライダーを検出できるので、例えば
- キャラクターの接地判定
- FPSにおける高速弾の当たり判定
- 敵キャラクターの視覚の実装
- ゲームオブジェクトのクリック判定
といったことに幅広く活用できます。
Raycastを可視化する方法
さてそんなRaycastですが、一つ非常に不便な点があります。それはレイは本当に透明で、エディタ上でもゲーム中でも全く見えないということです。つまりテストプレイしても何も表示されないので、Unityの標準機能だけでは正しくレイが発射されているのかを確認するのが困難なんですよね。
ただしアセットストアで検索してみるとレイを可視化できるアセットがいくつか配布されています。その中でも「Visual Raycast PRO」というアセットは(執筆時点では)無料で使えるので、ここではこのアセットを使いながらRaycastの使い方を説明していきますね。
Raycastの使い方
ではここからが本題で、色々な種類があるRaycast系の関数の使い方を一つずつ説明していきます。この記事でご紹介する関数は次の5つです(※本当は他にも2Dゲーム用のRaycast等があるのですが、ここでは省略します)。
- 最も基本的な「Raycast」
- 線状のレイを張る「LineCast」
- 球状のレイを発射する「SphereCast」
- カプセル状のレイを発射する「CapsuleCast」
- ボックス状のレイを発射する「BoxCast」
それぞれ詳しく見ていきましょう。
最も基本的な「Raycast」
まずは最も基本的なRaycast関数です。これはある一点に向かってレイを発射するタイプの最も基本的なRaycastになります。
この関数の戻り値はbool型で、引数は次のとおり。
Physics.Raycast (発射開始地点, 発射方向, ヒット情報, 最大距離, ヒットするレイヤー);
- 発射開始地点(Vector3)
- 発射方向(Vector3)
- ヒット情報(RaycastHit):
RaycastHit型の変数を渡すと、そこにヒットしたコライダー等の情報が格納される。 - 最大距離(float)
- ヒットするレイヤー(LayerMask):
レイがここで指定したレイヤーにだけヒットするようになる。
具体的には次のC#スクリプトのような使い方をします。
using UnityEngine; public class RaycastSample : MonoBehaviour { [SerializeField] Vector3 startPosition; [SerializeField] Vector3 direction; [SerializeField] float maxDistance; [SerializeField] LayerMask hitLayers; RaycastHit hit; void Update() { if (Physics.Raycast(startPosition, direction, out hit, maxDistance, hitLayers)) { Debug.Log(hit.collider.gameObject.name); } } }
これはあらかじめ指定した地点からレイを発射し、もし何らかのコライダーがヒットしたらそのコライダーのゲームオブジェクト名をコンソールに出力するサンプルスクリプトです。
レイがコライダーにヒットしたかどうかは戻り値で分かるので、if文の条件式の部分としてRaycast関数を書くのがよくある使い方となります。
線状のレイを張る「LineCast」
次は線状のレイを張るLineCast関数です。こちらはレイを発射するというよりは、ある地点間にレイを張るというようなイメージです。ただこれはかなりマイナーなRaycastで私は今まで一度も使ったことがありません。
この関数の戻り値もbool型で、引数は次のようになっています。
Physics.Linecast (始点, 終点, ヒット情報, ヒットするレイヤー);
- 線分の始点(Vector3)
- 線分の終点(Vector3)
- ヒット情報(RaycastHit):Raycastと同じ
- ヒットするレイヤー(LayerMask):Raycastと同じ
球状のレイを発射する「SphereCast」
球状の例を発射するSphereCast関数もあります。これは3Dゲームの接地判定等に頻繁に使うので覚えておいたほうがいいと思います。
戻り値はbool型で引数は次のとおりです。
Physics.SphereCast (発射開始地点, 半径, 発射方向, ヒット情報, 最大距離, ヒットするレイヤー);
- 発射開始地点(Vector3)
- 半径(float)
- 発射方向(Vector3)
- ヒット情報(RaycastHit):Raycastと同じ
- 最大距離(float)
- ヒットするレイヤー(LayerMask):Raycastと同じ
カプセル状のレイを発射する「CapsuleCast」
さらにカプセル状のレイを発射するCapsuleCast関数もあります。こちらもかなりマイナーなので個人的には使ったことがないです。
戻り値はやはりbool型で引数は次のようになっています。
Physics.CapsuleCast (球の中心1, 球の中心2, 半径, 発射方向, ヒット情報, 最大距離, ヒットするレイヤー);
- 球の中心1,2(Vector3)
- 半径(float)
- 発射方向(Vector3)
- ヒット情報(RaycastHit):Raycastと同じ
- 最大距離(float)
- ヒットするレイヤー(LayerMask):Raycastと同じ
ボックス状のレイを発射する「BoxCast」
最後はボックス状のレイを発射するBoxCast関数です。こちらも正直あまり使いませんが、BoxCastに関しては使い道があると思うので覚えておいても損はないかなと思います。
戻り値はbool型で引数は次のとおり。
Physics.BoxCast (中心点, ボックスサイズの半分の値, 発射方向, ヒット情報, ボックスの回転, 最大距離, ヒットするレイヤー);
- 中心点(Vector3)
- ボックスサイズの半分の値(Vector3):
「中心点からのボックスの大きさの半分の値」を各軸について入力する。 - 発射方向(Vector3)
- ヒット情報(RaycastHit):Raycastと同じ
- ボックスの回転(Quaternion):ボックスをどれだけ回転させるか。
- 最大距離(float)
- ヒットするレイヤー(LayerMask):Raycastと同じ
おわりに
以上、UnityのRaycastについてご説明しました。
Raycastは標準だと可視化できないので初心者の方にとってはつかみどころのない存在かもしれませんが、使いこなせると色々なことができるようになるのでぜひとも使い方を覚えて頂きたい機能の一つとなります。上記の内容を参考にしていただき、使い方をマスターしていただければと思います。
この記事がUnityでのゲーム開発のお役に立てば幸いです。