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

suhan0304·2023년 11월 27일
0
post-thumbnail

강의영상 (5)


개발

Shooting 로직

터렛이 적을 공격할 때 물건을 발사하도록 로직을 구현한다.

Turret.cs

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

void update()
{
	~~(생략)~~

    if(fireCountdown <= 0f) { //카운트 다운이 0이 되면 shoot 발사
        Shoot();
        fireCountdown = 1f / fireRate; // 1초에 fireRate 만큼 발사되도록 Countdown 설정
    }

    fireCountdown -= Time.deltaTime; //카운트 다운을 계속 줄여서 shoot이 반복되도로 ㄱ설정
        
}
void Shoot()
{
    Debug.Log("SHOOT!");
}

공격속도에 맞게 shoot 로그가 출력되는지 먼저 확인해도록 로직을 작성한 후 테스트해본다.

shoot이 주기에 맞춰 잘 출력되는 모습을 확인할 수 있다.

그 전에 변수의 개수가 좀 많아졌으므로 Header 함수를 이용해 인스펙터의 변수목록을 정리하고 진행하면 편하다.

Bullet 오브젝트 생성

3D Object > Sphere을 (0.6, 0.6, 0.6)의 크기로 생성해준 후 이름을 Bullet으로 설정한다. 추가적으로 Collider을 제거해준다. 새 재질을 생성해준 후 원하는 색상과 속성 값으로 조절해 준 후 Bullet에 적용시킨 다음 Bullet을 프리팹화 시킨다.

Bullet 생성

터렛에서 Bullet을 선언해주고 인스펙터에서 초기화 해준 후 총알 발사부에 총알을 복사하도록 선언해준다.

Turret.cs

void Shoot()
{
    Instantiate(bulletPrefab, firePoint.position, firePoint.rotation);
}

firePoint라는 빈 객체를 새로 생성해준 후 2D와 시점을 잘 사용해서 총구에 위치를 지정해준다.

Bullet 스크립트

using UnityEngine;

public class Bullet : MonoBehaviour
{
    private Transform target; //총알의 목표 오브젝트

    public float speed = 70f; //초알의 속도

    public void Seek(Transform _target)
    {
        target = _target; //Turret으로부터 Target을 넘겨받음
    }

    // Update is called once per frame
    void Update()
    {
        if (target == null) //목표가 null이 된다면 총알 파괴
        {
            Destroy(gameObject);
            return;
        }

        Vector3 dir = target.position - transform.position; //총알이 바라볼 방향
        float distanceThisFrame = speed * Time.deltaTime;   //총알이 프레임마다 이동할 거리

        if (dir.magnitude <= distanceThisFrame) //dir의 크기가 프레임 거리보다 작아진다면 = 객체에 도달했다는 뜻
        {
            HitTarget(); // 목표에 도달
            return;
        }

        transform.Translate(dir.normalized * distanceThisFrame, Space.World); //총알이 적을 향해 이동
    }

    void HitTarget() //총알이 적에 도달했을때
    {
        Destroy(gameObject); 
    }
}

총알이 적을 향해 잘 날아가고 적에 접근했을때 파괴되면서 "HIT SOMETHING!"이라고 출력되는 모습을 확인할 수 있다.

이펙트

이펙트 입자 효과를 주기위해 하이러카창에서 Effect > Particle System 오브젝트를 생성하고 아래와 같이 속성을 설정한다.

Particle System

  • Duration : 1.00으로 설정

  • Looping : 체크 해제한다.

  • Start LifeTime : 2로 설정

  • Start Speed : 랜덤하게 0 ~ 5로 설정

  • Start Size : 랜덤하게 0.15 ~ 0.25로 설정

  • Gravity Modifier : 1로 설정

  • Rate over Time : 0으로 설정

  • Burst 하나 추가 후 Time : 0 / Count는 5 ~ 10으로 설정

Shape

  • Shape : Shpere로 설정
  • Radius : 0.2로 설정

Size over Lifetime

  • Size : 마지막에 페이드 아웃되도록 커브 설정

Collision : 활성화

  • Type : World로 설정
  • Dampen : 0.6로 설정

    만약 길 밑으로 입자가 떨어지면 길에 Box Collider이 추가되어있는지 확인해보자

  • Collision Quality : Medium으로 설정

Renderer

  • BulletImpact라는 재질을 하나 새로 만들어서 설정
    - 검은색의 총알 색상으로 설정
  • Renderer Mode : Mesh로 설정
  • Cast Shadows : On으로 설정

유니티 공식 문서를 참고하면 파티클 시스템 모듈로 구성된 강력한 프로퍼티에 대해 이해할 수 있다. 자세히 알아두어 추후 게임 개발에 잘 사용할 수 있도록 한다.

완성된 파티클 시스템의 효과이다

이펙트 효과 추가

이제 Bullet 스크립트에서 이펙트가 실행되도록 오브젝트를 선언후 인스펙터에서 초기화해준 후 Play 로직을 작성한다.

Bullet.cs

void HitTarget() //총알이 적에 도달했을때
{
    //이펙트 생성(실행) 후 다시 제거
    GameObject effectIns = (GameObject)Instantiate(impactEffect, transform.position, transform.rotation); //이펙트 생성
    Destroy(effectIns, 2f); //2초후에 이펙트 다시 삭제

    Destroy(target.gameObject); //일단 바로 파괴하도록 작성 - 추후 HP 추가 예정
    Destroy(gameObject);        //충돌 시 총알은 바로 파괴
}

아래 결과물을 보면 알겠지만 고개가 돌아가는 중간에도 총알이 발사되서 살짝 부자연스러운 부분이 있는데 추후에 수정할 수 있으면 고개가 완전히 돌아간 다음에 bullet countdown이 작동하도록 수정하도록 한다.


결과물

업로드중..

profile
Be Honest, Be Harder, Be Stronger

0개의 댓글