게임클라이언트 프로그래밍/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)

#왼쪽 오브잭트는 Ray충돌이있다면 반사, 오른쪽 오브잭트는 반사 없음

 

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)