using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class LaserLine : Relic
{
    [SerializeField]
    private float rayDist = 100;
    public GameObject laser;
    private List<LineRenderer> lasers = new List<LineRenderer>();

    [SerializeField]
    private LayerMask layerMask;

    [SerializeField]
    private GameObject laserPoint;
    [SerializeField]
    private GameObject[] laserPoints;
    [SerializeField]
    private Material materialRed;

    private Vector3[] arrLaserPos;

    public override void Init()
    {
        base.Init();
        this.arrLaserPos = new Vector3[2];
    }

    private void Update()
    {
        this.Show();
    }

    public void Show()
    {

        int bulletAmount = PlayerStats.instance.bulletAmountCharacteristic;
        if (bulletAmount >= 10) bulletAmount = 10;

        float rotationZ = 0;
        int bulletCnt = 0;
        bool isEven = false;

        switch (bulletAmount)
        {
            case 1:
                bulletCnt = 1;
                break;
            case 2:
                bulletCnt = 2;
                isEven = true;
                break;
            case 3:
                rotationZ = 20;
                bulletCnt = bulletAmount;
                break;
            case 4:
                rotationZ = 20;
                bulletCnt = bulletAmount - 2;
                isEven = true;
                break;
            case 5:
                rotationZ = 40;
                bulletCnt = bulletAmount;
                break;
            case 6:
                rotationZ = 40;
                bulletCnt = bulletAmount - 2;
                isEven = true;
                break;
            case 7:
                rotationZ = 60;
                bulletCnt = bulletAmount;
                break;
            case 8:
                rotationZ = 60;
                bulletCnt = bulletAmount - 2;
                isEven = true;
                break;
            case 9:
                rotationZ = 80;
                bulletCnt = bulletAmount;
                break;
            case 10:
                rotationZ = 80;
                bulletCnt = bulletAmount - 2;
                isEven = true;
                break;
            default:
                break;
        }

        foreach (var laser in this.lasers)
        {
            Destroy(laser.gameObject);
        }
        this.lasers.Clear();

        if (isEven)
        {
            for(int i = 0; i < this.laserPoints.Length; i++)
            {
                var go = Instantiate(this.laser);
                go.transform.rotation = this.gunShell.lookRotation;

                LineRenderer lineRenderer = go.GetComponent<LineRenderer>();
                lineRenderer.startWidth = 0.05f; // 조준선의 시작 너비를 설정합니다.
                lineRenderer.endWidth = 0.05f; // 조준선의 끝 너비를 설정합니다.
                lineRenderer.material = this.materialRed;

                if (bulletAmount == 2) this.arrLaserPos[i] = this.gunShell.bulletPoints[i].transform.position;
                else this.arrLaserPos[i] = this.laserPoints[i].transform.position;

                RaycastHit2D hit = Physics2D.Raycast(this.arrLaserPos[i], go.transform.right, this.rayDist, ~this.layerMask);
                if (hit.collider != null)
                {
                    // 충돌이 발생한 경우, 충돌 지점까지의 길이만큼 렌더링합니다.
                    lineRenderer.SetPosition(0, this.arrLaserPos[i]);
                    lineRenderer.SetPosition(1, hit.point);
                }
                else
                {
                    // 충돌이 발생하지 않은 경우, rayDist 길이만큼 렌더링합니다.
                    lineRenderer.SetPosition(0, this.arrLaserPos[i]);
                    lineRenderer.SetPosition(1, this.arrLaserPos[i] + go.transform.right * rayDist);
                }

                this.lasers.Add(lineRenderer);
            }
        }

        for (int i = 0; i < bulletCnt; i++)
        {
            if (bulletAmount == 2) continue;
            var go = Instantiate(this.laser);
            var rotation = Quaternion.Euler(0, 0, rotationZ);

            go.transform.rotation = this.gunShell.lookRotation * rotation;
            if (isEven && rotationZ == 20) rotationZ = 0;
            rotationZ -= 20;

            LineRenderer lineRenderer = go.GetComponent<LineRenderer>();
            lineRenderer.startWidth = 0.05f;
            lineRenderer.endWidth = 0.05f;
            lineRenderer.material = this.materialRed;

            RaycastHit2D hit = Physics2D.Raycast(this.laserPoint.transform.position, go.transform.right, rayDist, ~this.layerMask);
            if (hit.collider != null)
            {
                lineRenderer.SetPosition(0, this.laserPoint.transform.position);
                lineRenderer.SetPosition(1, hit.point);
            }
            else
            {
                lineRenderer.SetPosition(0, this.laserPoint.transform.position);
                lineRenderer.SetPosition(1, this.laserPoint.transform.position + go.transform.right * rayDist);
            }

            this.lasers.Add(lineRenderer);
        }
    }
}

 라인 렌더러를 사용하여 구현하였으며 같은 방향으로 레이캐스트를 만들어 충돌된 위치까지 라인 렌더러를 렌더링하도록 하여 기능 구현하였습니다. 실제 조준선 같은 효과를 주기 위해서는 포스트 프로세싱을 사용하여 셰이더 효과를 주어야 합니다.

 

+ Recent posts