【Unity2D】2点間に障害物がないか検知する


はじめに

こんばんは.ディジコンアドベントカレンダー2021 12月17日担当のmimiです.

adventar.org


Unityで何かを作っているとき,2点間に障害物があるかどうかを知りたいことがあります.
例えば,「壁の向こうからではアイテムを取れないようにしたい」,「障害物の後ろにいれば敵に発見されないようにしたい」という場合です.

今回は2点間に障害物がないか検知してみます.以下が方針です.
①Raycastを用い,1点からもう片方の1点に光線を放つ.
②もし光線が何かにぶつかれば障害物があり,何にもぶつからなければ障害物がないと分かる.

Raycastについては前回紹介しました.レーザーポインターのようなもので,機能としてその光線が当たった位置や当たり判定を持つオブジェクトの情報を取得することができます.
分かり易いので「光線」と表現しています.

mimi2021.hatenablog.com

やってみる

まず,障害物となりえるオブジェクトにコライダー(当たり判定)を付けておきます.(Box Collider 2Dなど)
これがないとRaycastに反応されません.

次にスクリプトを書いていきます.
※今回は2Dを想定しています.

Vector2 point1 = new Vector2(2, 10);
Vector2 point2 = new Vector2(10, 30);

RaycastHit2D result = Physics2D.Raycast(point1, (point2 - point1), (point2 - point1).magnitude);

if(result.collider == null)
{
 Debug.Log("障害物はありません");
}

else
{
 Debug.Log("障害物があります");
}

これで完成です.

RaycastHit2D result = Physics2D.Raycast(point1, (point2 - point1), (point2 - point1).magnitude);
でpoint1からpoint2にかけて光線を飛ばし,当たったオブジェクトを変数resultに代入しています.もし道中何もなかったらここには何も入りません(nullになります)
if(result.collider == null)
で何にも当たらなかったことを確認し,そうであれば"障害物はありません"と表示します.

終わりに

今回のやり方では,開始地点となるオブジェクト自体にコライダー(当たり判定)が付いていると自分自身に当たるという問題があります.これを回避するためには,レイヤーマスクを指定して光線が障害物にしか当たらなくするなどといった工夫が必要です.


本日はここまでです.ありがとうございました.