本記事では、Unityの機能の一つであるRaycastを紹介します。この機能はUnityでゲーム開発するうえで切っても切れない関係と言えます。
是非ともこんな方に読んでいただきたいです。
- Unityを使ってゲーム開発したいという方
- Raycastの特徴を知りたい方
開発をしたいという方を意識しているので、Unityの専門用語や関数が出てきますが是非最後までお付き合いください!
Unityについて知りたい方は以下のリンクを参考にしてください。
目次
|Rayとは
Rayとは「光線」という意味です。
Unityに出てくるRayも同じ意味合いで用いられ、専用のクラスが存在します。
一般的にRayはRaycastと合わせて使用されます。後ほど詳しく説明しますが、RaycastはRayを飛ばし、その先にあるオブジェクトを検出してくれる機能です。
この機能を使うと、
- FPSの当たり判定
- アイテムの取得
- NPCがプレイヤーを発見
などを実現できます。
|Raycastとは
Raycastのcastは「投げる」という意味です。
ですので、Raycastで行うことはRay(光線)をcast(投げる)ということです。
Raycastを使用すると以下に示す結果が得られます。
- Rayがオブジェクト(コライダ)を検出したかどうか
- 検出したオブジェクトの情報
1つ目はRayがオブジェクト(コライダ)を検出したかどうかを返してくれます。
コライダについては一旦、当たり判定を与えてくれるものという認識で大丈夫です。
これによって、操作したいもしくは操作した結果の対象があるかどうかを知ることができます。
例えば、FPSゲームで弾を発射したときに命中したかどうかの判定を行えます。
2つ目は検出したオブジェクトを取得できます。これはかなり利用する機会が多いかと思います。
Rayが検出したオブジェクトがどんなものだったかを教えてくれます。先ほどのFPSの例ですと、弾を発射して命中したものが壁だったのか、それともターゲットだったのかという具体的な情報が得られます。
|Raycast関数と使い方
先ほどまでの内容でRaycastの便利さを理解していただけたかと思います。
実はRaycastにはいくつか種類があります。
高度な開発をする際にはぜひ活用して頂きたいので、そちらも紹介させていただきます。
Raycast
まずは、基本となるRaycastです。
Raycastの関数は以下のようにして呼び出します。
Raycast(Rayの開始座標、Rayの方向、ヒット情報、最大距離、レイヤーマスクの設定、トリガーオブジェクトの設定)
各引数については
- Rayの開始座標
- Rayの方向
- ヒット情報
検出したオブジェクトを受け取る変数です。
- 最大距離
Rayが届く最大の距離です。
- レイヤーマスクの設定
Rayが検出可能なオブジェクトをレイヤーごとにフィルタリングするものです。 - トリガーオブジェクトの設定
トリガーオブジェクトを検出対象にするかの設定です。トリガーオブジェクトは触れたり、すり抜けたりしたときに何らかの処理が発生するトリガーの役割を果たします。
※レイヤーマスクの設定とトリガーオブジェクトの設定はこれから紹介するRaycastに共通する引数なので以降省略します。
ある地点から直線状に引いた先にあるオブジェクトの検出に使用されます。
使用例も多く、使い勝手がいいので、初めての方は試していただきたいです。
余談ではありますが、Raycastの関数を呼び出すときに引数としてRayを渡すことも可能です。
こちらの方法で記述している例もあるので、頭の片隅に覚えておくと良いかと思います。
LineCast
次はLineCastになります。先に断っておきますが、かなりマイナーなので使用することはないかもしれません。
ですので、こういうのもあるのかといった程度でお考えいただければ良いと思います。
どういったものかと言いますと、名前から察する通り線状にRayを張る関数です。
マイナーな理由なのは、先ほどのRaycast関数の機能とほぼ同じだからだと思われます。
LineCastの関数は以下のようにして呼びます。
Linecast(Rayの始点、Rayの終点、ヒット情報)
先ほどのRaycast関数とほとんど同じですが、最大距離ではなく終点の座標を指定する点が異なります。終点の座標が固定で決まっている!という状況でなければ使用することはないかと思われます。
SphereCast
ここから紹介するものは形状を持ったRayになります。
まずはSphereCastです。Sphereは「球状」という意味ですので球状のRayを飛ばす関数です。
SphereCastの関数は以下のようにして呼びます。
Spherecast(Rayの開始地点の中心、半径、Rayの方向、ヒット情報)
Ray開始地点の決め方、半径の指定が必要になります。この関数は球状のRayを飛ばすので、球の中心がRay開始地点となっています。
また、半径を指定することでRayの大きさを決めています。
形状を持っていますので検出するときに範囲を持たせることができます。
3Dゲームの接地判定に用いられることが多いです。
CapsuleCast
続いて紹介するのはCapsuleCastです。
Rayの形状としてはカプセル状です。
カプセルという形状が扱いにくいせいか、こちらもマイナーな関数です。
CapsuleCastの関数は以下のようにして呼びます。
Capsulecast(カプセルのスタート地点にある球の中心、カプセルの終了地点にある球の中心、半径、Rayの方向、ヒット情報、最大距離)
カプセルの形状を指定する方法が複雑になっています。カプセルの構造は2つの球を用意して、一方の球をもう一方の球に移動させたときに通過した領域でできています。
ですので、この関数は2つの球の中心を指定して呼び出します。
これまで何度かお伝えしてきましたが、扱いが難しいので使う機会は少ないかと思います。
BoxCast
最後にBoxCastの紹介です。
今までの紹介を聞いているとなんとなく察するかと思いますが、箱型のRayを飛ばします。
BoxCastの関数は以下のようにして呼びます。
Boxcast(箱の中心、箱のサイズの半分、Rayの方向、箱の回転、ヒット情報、最大距離)
この関数は箱型のRayを飛ばすので、箱の中心や大きさ、回転を与えてあげます。
BoxCastも検出に範囲を持たせられるので、3Dゲームの接地判定に用いられることがあります。
箱型で判定したいのか球状で判定したいのかによって使い分けると良いと思います!
|Raycastの注意点
Raycastを使う上での注意点をいくつかまとめました。
- Rayは透明
Rayは透明なので正しい位置にRayが飛んでいないなどのエラーを見つけるのが困難です。ですので、Debug.DrawRayを用いることでRayを可視化しながら開発を進めることがおススメです。
参考URL: https://docs.unity3d.com/ja/2020.3/ScriptReference/Debug.DrawRay.html - Rayの開始位置のコライダは検出しない
Raycastの特性としてRay開始位置のコライダを検出しません。例えば、接地判定をするときには少し離した位置からRayを飛ばす必要があります。 - 処理が重い
便利だからといって使いすぎると重くなるので注意しましょう。Rayを短くすると軽量化できるので活用してみてください。
|まとめ
いかがでしたでしょうか。
Raycastをうまく活用すれば様々なゲームの機能を実現できそうですよね。
ただし、便利だからといって使いすぎには注意してください。
Raycastにもいくつか種類があるので、是非試してみてそれぞれのメリット、デメリットをさらに理解していただけたら幸いです。
最後まで見ていただきありがとうございます。