UnityのRaycastの使い方
UnityのRaycastは光を発射する位置と方向を決め、光が進んだ先のゲームオブジェクトを取得することができる。この記事を読む前に、C#でのスクリプトの開き方、基本的な構文の作り方、変数、演算子がわからない場合は先に以下の記事で確認してほしい。
UnityのC#の書き方
UnityのC#の変数・演算子
if文の条件分岐
Raycastは銃弾を飛ばして敵にヒットさせる処理やキャラが地面にいるか空中にいるかを判断するなど、様々な場面で使えるのでぜひマスターしてほしい。基本の使い方を紹介していく。
Raycastの使い方目次
Raycastの基本Rayが見えるようにする
様々な形のRay
注意点
目次にもどる
Raycastの基本
Raycastの基本の書き方は以下の通り。Physics.Raycast(発射位置,Rayの方向,衝突したゲームオブジェクト情報,Rayの長さ)
絶対に書かないといけないのは発射位置とRayの方向のみ。
試しにゲームオブジェクトCubeとSphereを作り以下のように配置する(X軸とY軸を同じとしてCubeからZ軸が進む方向にSphereを配置)。
そして以下のようなスクリプトを作成し、Cubeにアタッチして再生してみよう。Cubeから出た光がSphereに衝突し、そこから情報をとってくることができる。
rayitiにはCubeのゲームオブジェクトの位置、rayhoukouにはVector3.forward(0,0.1つまりZ軸方向を示す)を代入している。
よって、if (Physics.Raycast(rayiti, rayhoukou, out rayzyouhou, 6))はCubeの位置からZ軸方向に光を6飛ばし、光が当たったゲームオブジェクトの情報をrayzyouhou(最初にRaycastHit型の変数として宣言)に代入し、ゲームオブジェクトに光が衝突したなら中身の処理が行われることになる(6の部分に何も設定しなければ無限に光が飛ぶがそれだけ処理が重くなるのでできるだけ指定したほうがいい。ただ値が小さいとSphereまで光が届かないので注意)。
中身の処理はDebug.Log(rayzyouhou.collider.gameObject.transform.position);でログを出している。
rayzyouhouはにRaycastHit型の変数であり、衝突した対象のColliderコンポーネントを所持している。
ColliderクラスはプロパティとしてgameObject(コライダーがアタッチされているゲームオブジェクト)を持っている。
よってrayzyouhou.collider.gameObject.transform.positionとして、rayzyouhouに入っているコライダーがアタッチされたゲームオブジェクトの位置がわかり、それを出力することができる。
目次にもどる
Rayが見えるようにする
Rayは無色透明の光であり、何も設定しなければ見えることはない。だが色のある光を出すことも可能だ。
Debug.DrawRay(発射位置,Rayの方向と長さ,Rayの色,Rayの表示時間)
以下のスクリプトをCubeにアタッチしてみよう。
追加したのはDebug.DrawRay(gameObject.transform.position, Vector3.forward * 6, Color.red, 1f);の部分。
gameObject.transform.positionで光の出る位置、Vector3.forward * 6で光の方向と長さ、Color.redの部分で光の色。1fの部分で光が出る時間を指定している。
以下のように光が出るので、検証などで重宝する。
目次にもどる
様々な形のRay
Rayにはこれまで紹介した線型以外に、形のある光も出すことができる。SphereCastは球型の光を放つことができる。
Physics.SphereCast(発射位置,球の半径,Rayの方向,衝突したゲームオブジェクト情報,Rayの長さ)
以下のようなスクリプトを作成し、Cubeにアタッチして再生してみよう。Sphereの情報をとってこれる。
0.5fの半径の光を出すことができる。
SphereCastはある程度広い範囲を探知したい場合に便利。キャラが地面についているかどうかなども判断できる。ぜひ覚えておこう。
BoxCastは箱型の光を放つことができる。
Physics.BoxCast(箱の中心の座標,箱の軸の半分の長さ,Rayの方向,衝突したゲームオブジェクト情報,ボックスに回転を与える引数,Rayの長さ)
以下のようなスクリプトを作成し、Cubeにアタッチして再生してみよう。Sphereの情報をとってこれる。
わかりづらいのはボックスに回転を与える引数だと思う。Quaternionの理解は初心者には難しい。ひとまず、ボックス型の光を出したいだけならQuaternion.identity(回転していないときの回転値)と入力しておけばOKだ。
目次にもどる
注意点
ここまで、Raycast系の関数を紹介してきた。これらの関数の全てに当てはまる注意点は発射時の位置は検知しないということ。線を放つだけのRaycastでは困ることはまずない。
だが、SphereCastやBoxCastはRayの大きさの範囲を指定でき、発射時にその範囲に含まれた部分が探知されないことになる。この仕様を知らないためにつまづく人がかなりいるので注意しよう。