触れたものを探知するレーザーをLineRendererで作成|Unityゲーム制作

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");
}

タイトルとURLをコピーしました