Unityである一定の範囲内に来たら何か処理をやりたい!なんてことはありませんか?
例えばタワーディフェンスゲームですと敵がルートを経とって自陣のユニットの範囲内に侵入してきたら攻撃するみたいな、あるいはプレイヤーが敵に近づいていってある一定の距離になったらその敵は追ってくるようなこと等などですね。ゲーム制作をする上で多く場面においてこの「ある一定の範囲内に入ったら何かをやりたい」は割と需要があると思います。
その需要を満たすためのカギとなるのはRaycastというものですね。
それではRaycastとは何者なのか、どうやって使うかを詳細に見ていきましょう。
尚、今回はPhysics2D.Raycastを使って解説していきます。3Dの場合は概念は同じなので何かのお助けになると嬉しいです。
Raycastとは何か
まずRaycastとは何かですがRayの意味を辞書で引いてみると「光線」と解釈されますね。UnityにおけるRayとはつまり、レーザーのようなものとイメージしてみると分かりやすいです。実際にDebug.DrawRayを使って確認してみると赤い線(色は変更可能)が画面上に表示されるのでまさにレーザーそのものですね。Raycastを使って実装する時にこのDebug.DrawRayを併用してやると確認しやすいのでおすすめです。
で、肝心のRaycastですがあるGameObjectから決まった方向、決まった距離でレーザーを飛ばしてレーザーでヒットさせた物体を検知したらやりたい処理を行うといった寸法です。

Physics2D.Raycastの使い方
書式
var hit = Physics2D.Raycast(自身のposition, 方向(ベクトル), rayの長さ, 対象のLayer);
実例
プレイヤーは敵の監視範囲内に入ったら敵は追ってくるようなことをやりたい時をイメージしてください。
プレイヤーは敵から見て決まった距離に入ったかどうかを検知して入ったら追ってくるようにし、範囲外なら何もしないといった挙動を実装したい場合は以下のようにすればいいです。
var hit(プレイヤー) = Physics2D.Raycast(敵のposition, プレイヤーとのベクトル, 決まった距離, プレイヤーのLayer);
if (hit.collider != null) {
Debug.Log("プレイヤーを見つけたぞ!やっつけろ!");
// 追ってくる処理をここで書く
}
少し説明しますと
- hitはプレイヤーです。プレイヤーは敵の決められた範囲内に入っていったらhit.colliderにはプレイヤーのcolliderは入ります。
- Physics2D.Raycast
- 第1引数はorigin、この例の場合はつまり敵のpositionを指定するようにしてください。
- 第2引数は対象GameObjectとのベクトル(方向)を指定するようにしてください。
- ベクトルの算出方法はプレイヤーのposition – 敵のpositionになります。尚プレイヤーと敵は常に動いていることを考えるとベクトルはUpdateやFixedUpdateで行う必要があります。
- 第3引数はRayの長さを指定するようにしてください。5fや10fなど適切な距離を実行してみて決めればいいです。
- 第4引数はプレイヤーのLayerを指定するようにしてください。
以上!プレイヤーは敵の決まった範囲内に入っていったら敵は追ってくるような処理はできました。
試してみてください。
コメント