[Unity][3D-Game] Tower Defense Game (12)

suhan0304·2023년 12월 16일
0
post-thumbnail

강의영상 (14)


개발

레이저 포탑 생성

새로운 포탑인 레이저 포탑의 모델을 가져오기 위해 파일을 임포트해준다.

이제 게임 씬에 해당 모델을 드래그해서 프리팹화 시키기 전에 기본적인 설정을 진행해준다.

  • Stand의 이름을 Base로 수정
  • Turret의 이름을 Head라고 수정
  • 기타 재질의 색, Albedo, Smoothness를 원하는 수치로 조정

다른 포탑과 마찬가지로 LaserBeamer에 Turret 스크립트를 컴포넌트로 추가해준다.

  • Range : 20으로 설정한다.
  • FireRate는 지속 데미지로 할 것이기 때문에 FireRate
    는 중요하지 않음

다른 포탑과 마찬가지로 PartToRotate를 Head의 자식으로 만들어준 후 다시 꺼낸 다음에 z출(파랑 화살표)와 바라보는 방향이 같도록 Rotation을 (0, -90, 0)으로 설정한 후에 다시 Head를 PartToRotate에 자식으로 넣어준다.

이제 작업이 끝난 PartToRotate를 LaserBeamer의 Turret 컴포넌트의 PartToRotate에 드래그드랍해서 초기화해준다. 레이저 포탑은 다른 포탑처럼 총알을 발사하는 형식이 아니기 때문에 BulletPrefab은 상관하지 않는다. 일단 기본 Bullet을 Bullet Prefab으로 사용한다.

마지막으로 레이저가 나갈 FirePoint를 LaserBeamer 자식 오브젝트로 만들어 준 후 동일하게 Turret 스크립트 컴포넌트에 드래그드랍해서 초기화해준다.

이 FirePoint을 추후에 레이저 역할을 할 라인 렌더러의 한 점으로 사용할 예정이다.

이제 모든 설정을 마친 레이저 포탑을 프리팹화 시킨다.

Shop UI 업데이트

레이저 포탑이 상점에 뜨게 하기 위해 OverlayCanavas의 MissileLauncherItem을 Ctrl+D 해준 후 LaserBeamerItem으로 이름을 변경한다.

  • Cost Text를 "$350"으로 수정한다.

이제 icon을 수정하기 위해 Sprites 폴더에 PNG 파일 형식을 불러온다. 이 때 불러온 파일의 Texture Type을 Sprite (2D and UI)로 수정해주고 Apply 해주어야한다.

TextureType = Sprite (2D and UI)로 설정 후 Apply 누르면

이제 LaserBeamerItem의 image에 해당 스프라이트를 드래드랍해서 초기화 한 후 Layout Element 컴포넌트의 Prefferd Width, Height를 사용해 크기를 적절히 조절해준다.

Shop 스크립트

Shop.cs에서 LaserBeamerItem을 선택 후 건설하면 레이저 포탑이 건설되도록 코드를 아래와 같이 작성한다.

Shop.cs

public TurretBlueprint LaserBeamer; //레이저 포탑 청사진

public void LaserBeamerLauncher() //레이저 포탑 건설
{
    Debug.Log("LaserBeamer Selected"); //테스트용 출력
    buildManager.SelectTurretToBuild(LaserBeamer); //레이저 포탑를 건설하도록 설정
}

이후에 인스펙터의 Shop 스크립트에 기존에 만들어놓은 LaserBeamer 프리팹을 드래그 드랍해서 초기화해준다.

그러고 난 후 사전에 만든 버튼 이벤트를 해당 메소드에 연결시킨다.

레이저 생성

이제 레이저 포탑에서 발사될 레이저를 만들어보자. LaserBeamer 오브젝트의 컴포넌트로 Rine Renderer을 추가한다.

  • Lighting의 CastShadows와 ReceiveShadows를 모두 꺼준다.

  • width를 적절히 조절한다. (0.3 정도)

이제 레이저에서 사용할 재질을 하나 만들어주자. 해당 재질을 Line Renderer 컴포넌트의 Materials에 드래그드랍해서 초기화해주고 재질의 설정을 진행한다.

  • Shader를 Alpha Blended로 설정

이후 다시 Line Renderer로 돌아와 시작 색을 주황 + 노랑으로 설정해준다.

Turret 스크립트

레이저 포탑의 라인 렌더러 기능을 구현하기 전에 Turret.cs 의 변수들을 다시 정리해주고, Laser를 Bullet으로 사용하는지 여부를 확인하는 변수와 Laser을 사용할 경우 불러오게 될 LineRenderer 변수도 추가해준다.

Turret.cs

public Transform target; // 공격할목표 오브젝트

[Header("General")]

public float range = 15f; // 사거리는 15로 설정


[Header("Use Bullets (default)")]

public GameObject bulletPrefab; //총알 프리팹
public float fireRate = 1f; //초당 발사하는 탄의 개수 (공격 속도)
private float fireCountdown = 0f; //fireRate에 맞게 공격하도록 fireCountdown을 설정한 후 해당 주기마다 공격

[Header("Use Laser (default)")]
public bool useLaser = false; //레이저를 사용하는 포탑인가? (기본값은 False)
public LineRenderer lineRenderer; //레이저를 사용하면 라인 렌더러가 필요함

[Header("Unity Setup Fields")]

public string enemyTag = "Enemy";

public Transform partToRotate; //실제로 base를 제외하고 회전될 오브젝트의 트랜스폼
public float turnSpeed = 10f;

public Transform firePoint; //총알이 복사되어 생성될 위치

LaserBeamer 프리팹으로 가서 Use Laser를 체크해주고 라인렌더러를 초기화 해준다.

이제 Turret 스크립트를 수정해 라인 렌더러를 적에게 연결되게 그리는 과정을 추가해준다.

Turret.cs

void Update()
{
    if (target == null) {//타겟이 없으면
        if(useLaser) //레이저 포탑은 레이저를 꺼줘야 함 ( 라인 렌더러를 지워줘야 함)
        {
            if(lineRenderer.enabled) //라인 렌더러 컴포넌트를 비활성화
                lineRenderer.enabled = false;
        }
        return;
    }

    //--- 만약 target이 있다면 ---
    //target Lock On
    LockOnTarget();

    if(useLaser) //레이저를 사용하는 포탑의 경우
    {
        Laser(); //레이저 그리기
    }
    else //일반 총알을 사용하는 경우 
    {
        if (fireCountdown <= 0f)
        { //카운트 다운이 0이 되면 shoot 발사
            Shoot();
            fireCountdown = 1f / fireRate; // 1초에 fireRate 만큼 발사되도록 Countdown 설정
        }

        fireCountdown -= Time.deltaTime; //카운트 다운을 계속 줄여서 shoot이 반복되도로 ㄱ설정
    }
        
}

void Laser() //레이저 그리기
{
    if (!lineRenderer.enabled) //레이저(라인 렌더러)가 꺼져있으면 키고 나서 위치 설정
        lineRenderer.enabled = true;
    lineRenderer.SetPosition(0, firePoint.position); //시작점을 Fire Point로 
    lineRenderer.SetPosition(1, target.position); //끝점을 Fire Point로 
}

이제 결과를 확인해보자.


결과물

profile
Be Honest, Be Harder, Be Stronger

0개의 댓글