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);
}
}
}
라인 렌더러를 사용하여 구현하였으며 같은 방향으로 레이캐스트를 만들어 충돌된 위치까지 라인 렌더러를 렌더링하도록 하여 기능 구현하였습니다. 실제 조준선 같은 효과를 주기 위해서는 포스트 프로세싱을 사용하여 셰이더 효과를 주어야 합니다.
'Unity2D' 카테고리의 다른 글
Unity) [유니티 2D] 무기(총기) 변경 시 능력(특성)치 적용 (0) | 2023.05.04 |
---|---|
Unity) [Data] 데이터 연동하여 플레이어 능력치 구현 (0) | 2023.05.02 |
Unity) [유니티 2D] 보조 슈팅 공격(그레네이드 런쳐) 구현 (0) | 2023.04.29 |
Unity) [유니티 2D] 지속(독) 데미지 특수효과 구현 (0) | 2023.04.29 |
Unity) [유니티 2D] 대시 이동에 공격기능 추가하기 (0) | 2023.04.28 |