Unityで触れたオブジェクト(物)を検知するレーザーを実装してみます。今回は「Physics2D.Raycast」と「LineRenderer」を利用して実装していきます。
はじめに
Unityのバージョンは2021.3.14f1で作成しています。下記のような感じで、灰色の動く壁にレーザーが当たったら、レーザーが短くなるのを実装します。

下記記事で作成した当たり判定に、「LineRendererを追加」したイメージです。
実装開始
はじめにLineRendererのレーザーを作成していきます。
レーザーの作成
「2DObject」→「Sprites」→「Circle」を追加します。

Circleの配下に「CreateEmpty」で空のオブジェクトを追加して、名前を「Laser」に変更します。

「AddComponent」から「LineRenderer」を追加。サイズと幅を変更します。

色とマテリアルも変更しておきます。

下記のような感じになります。

スクリプトの作成
下記スクリプトを作成します。レーザーの長さを調整できるようにしています。
using UnityEngine; public class LaserLine : MonoBehaviour { [SerializeField] private float LaserYSize; private LineRenderer rend; private void Start() { rend = GetComponent<LineRenderer>(); Vector2 laserY = new Vector2(0f, LaserYSize); rend.SetPosition(1, laserY); } }
スクリプトを追加して、パラメータをセットします。

壁の作成
次にレーザーを防ぐ壁を作成していきます。「2DObject」→「Sprites」→「Square」を追加します。

名前を「Wall」に変更してスケールと色を変更します。

下記スクリプトを作成します。左右に自動で動かしています。
using UnityEngine; public class AutoMove : MonoBehaviour { private float MoveSpeed = 3.0f; void FixedUpdate() { transform.position = new Vector3(Mathf.Sin(Time.time) * MoveSpeed, 0, 0); } }
下記記事が参考になります。
「BoxCollider2D」とスクリプトを追加します。

実行すると下記のような感じになります。壁をレーザーが通り抜けるので壁で止まるようにします。

レーザーを変更
壁にタグをセットします。

レーザーのスクリプトを下記に変更します。
using UnityEngine; public class LaserLine : MonoBehaviour { [SerializeField] private float LaserYSize; private LineRenderer rend; private void Start() { rend = GetComponent<LineRenderer>(); LaserPosReset(); } private void Update() { RaycastHit2D hit = Physics2D.Raycast(transform.position, transform.up, LaserYSize); if (hit.collider != null) { if (hit.collider.tag.Equals("Wall")) { Vector2 laserY = new Vector2(0f, Vector2.Distance(transform.position, hit.point)); rend.SetPosition(1, laserY); } } else { LaserPosReset(); } } private void LaserPosReset() { Vector2 laserY = new Vector2(0f, LaserYSize); rend.SetPosition(1, laserY); } }
実行すると下記のような感じに壁をレーザーが通らなくなります。

プレイヤーの追加
オマケでプレイヤーを追加していきます。下記の記事を参考に、左右に動かすことのできるプレイヤーを作成しています。

レーザーのスクリプトを下記に変更します。
using UnityEngine; public class LaserLine : MonoBehaviour { [SerializeField] private float LaserYSize; private LineRenderer rend; private void Start() { rend = GetComponent<LineRenderer>(); LaserPosReset(); } private void Update() { RaycastHit2D hit = Physics2D.Raycast(transform.position, transform.up, LaserYSize); if (hit.collider != null) { if (!hit.collider.tag.Equals("Wall")) { Debug.Log("player hit"); } Vector2 laserY = new Vector2(0f, Vector2.Distance(transform.position, hit.point)); rend.SetPosition(1, laserY); } else { LaserPosReset(); } } private void LaserPosReset() { Vector2 laserY = new Vector2(0f, LaserYSize); rend.SetPosition(1, laserY); } }
実行すると下記のような感じに。プレイヤーにレーザーが当たるとログを出力しています。

下記の場所で、壁以外をプレイヤーとしていますが、実際にはプレイヤーにタグをつけて判断するとレーザーに触れているオブジェクトが壁なのか、プレイヤーなのか、他にオブジェクトが増えても判断しやすいですね。
if (!hit.collider.tag.Equals("Wall")) { Debug.Log("player hit"); }