Edited at

【Unity2D】Physics2D.Raycast利用時に真下にレイを飛ばすやりかた


レイキャストを使う時に詰まった所

個人的に詰まった箇所をメモ。

プレイヤーの真下にレイを飛ばして、特定のタグの付いたオブジェクトがあればその座標を算出するプログラムです。ミスタードリラー的なゲームを作るのに役立つかも。


参考:プレイヤーアタッチしているもの


Player.cs

        Vector2 StartPosition = transform.position;

Vector2 EndPosition;

//移動判定用 衝突するレイヤーはすべて入れる
int LayerObject = LayerMask.GetMask(new string[] { "Chara", "Wall", "Block" });
//自身の衝突判定を無くしてPhysics2Dの誤確認を無くす
boxCollider.enabled = false;
//Raycastで下方向に特定タグの付いたオブジェクトが無いかを検出
RaycastHit2D HitObject = Physics2D.Raycast(StartPosition, Vector2.down, 10, LayerObject);
//衝突判定を戻す
boxCollider.enabled = true;
//下方向の空白のスペースの深さ
int Depth = -(int)HitObject.distance;
//HitObject.distanceは検出したオブジェクトの長さ
EndPosition = StartPosition + new Vector2(0, Depth); ;


RaycastHit2D オブジェクト名= Physics2D.Raycast(始まりの座標, レイの方向, レイの長さ, 衝突するレイヤー);

上のようなイメージで特定の座標からレイ(光線)を飛ばして、最初にぶつかったものの情報を取得してくれています。下方向に飛ばすのにはVector2.downを使えば良い。


最初に書いていた駄目なプログラム


駄目だったプログラム

        Vector2 StartPosition = transform.position;

Vector2 RayPosition = StartPosition + new Vector2(0, -1);
Vector2 EndPosition;

//移動判定用 衝突するレイヤーはすべて入れる
int LayerObject = LayerMask.GetMask(new string[] { "Chara", "Wall", "Block" });
//自身の衝突判定を無くしてPhysics2Dの誤確認を無くす
boxCollider.enabled = false;
//Raycastで下方向に特定タグの付いたオブジェクトが無いかを検出
RaycastHit2D HitObject = Physics2D.Raycast(StartPosition, -Vector2.up, 10, LayerObject);
//衝突判定を戻す
boxCollider.enabled = true;
//下方向の空白のスペースの深さ
int Depth = -(int)HitObject.distance;
//HitObject.distanceは検出したオブジェクトの長さ
EndPosition = StartPosition + new Vector2(0, Depth); ;


Vector2 RayPosition でレイの向いている方向を定義しているが「StartPosition + new Vector2(0, -1);」では斜め下にレイが向いてしまい変なオブジェクトを取得していました。