게임클라이언트 프로그래밍/R&D
Bullet Pattern R&D (Laser,LineRenderer를 이용한 공격 패턴 2)
Game Client Lee Hwanguk
2023. 3. 26. 02:29
https://www.youtube.com/watch?v=vTnsYnlnMsw&list=PL78jMnwPOfjAtIdma8F26AQdJGwydtI80&index=10
# 오브잭트에 충돌하면 반사가 되는 반사각 (inDirection -> Result)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class LaserTest2 : MonoBehaviour
{
// Line OF Renderer
public LineRenderer LineOfSight;
public int reflections; //반사각
public float MaxRayDistance; //최대 Ray 거리
public LayerMask LayerDetection; //Layer
public float rotationSpeed; //회전속도
private void Start()
{
Physics2D.queriesStartInColliders = false; //Layer충돌 감지 false
}
private void Update()
{
transform.Rotate(rotationSpeed * Vector3.forward * Time.deltaTime); //Vector3.forward ->z 축으로 회전
LineOfSight.positionCount = 1; //vertices 정점
LineOfSight.SetPosition(0, transform.position); //linerender start ->transform.position
RaycastHit2D hitInfo = Physics2D.Raycast(transform.position, transform.right, MaxRayDistance, LayerDetection); //(origine, 방향(right), 거리(MaxRayDistance).MaxRayDistance)
// Ray
Ray2D ray = new Ray2D(transform.position, transform.right); //ray 생성, (transform.position, transform.right)
bool isMirror = false;
Vector2 mirrorHitPoint = Vector2.zero; //(0,0)
Vector2 mirrorHitNormal = Vector2.zero;
//반사각
for (int i = 0; i < reflections; i++) // reflections 만큼 반복
{
LineOfSight.positionCount += 1; //vertices 정점 +=1
if (hitInfo.collider != null) //충돌이 있다면?
{
LineOfSight.SetPosition(LineOfSight.positionCount - 1, hitInfo.point - ray.direction * -0.1f);
isMirror = false;
if (hitInfo.collider.CompareTag("Mirror")) //"Mirror'" 반사
{
mirrorHitPoint = (Vector2)hitInfo.point;
mirrorHitNormal = (Vector2)hitInfo.normal;
hitInfo = Physics2D.Raycast((Vector2)hitInfo.point - ray.direction * -0.1f, Vector2.Reflect(hitInfo.point - ray.direction * -0.1f, hitInfo.normal), MaxRayDistance, LayerDetection);
isMirror = true;
}
else
break;
}
else
{
if (isMirror) //true
{
LineOfSight.SetPosition(LineOfSight.positionCount - 1, mirrorHitPoint + Vector2.Reflect(mirrorHitPoint, mirrorHitNormal) * MaxRayDistance);
break;
}
else
{
LineOfSight.SetPosition(LineOfSight.positionCount - 1, transform.position + transform.right * MaxRayDistance); //Transform.right=(1,0,0)
break;
}
}
}
}
}
#하데스의 Laser 패턴. 기둥 오브잭트와 충돌하면 Laser 끊김, 일정한 속도로 회전
#Target을 감지하고 Layer를 구분하며 끊김, 추격을 구현해보자 (Layer=Platfrom, Tage=Mirror)