터렛이 적을 공격할 때 물건을 발사하도록 로직을 구현한다.
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 함수를 이용해 인스펙터의 변수목록을 정리하고 진행하면 편하다.
3D Object > Sphere을 (0.6, 0.6, 0.6)의 크기로 생성해준 후 이름을 Bullet으로 설정한다. 추가적으로 Collider을 제거해준다. 새 재질을 생성해준 후 원하는 색상과 속성 값으로 조절해 준 후 Bullet에 적용시킨 다음 Bullet을 프리팹화 시킨다.
터렛에서 Bullet을 선언해주고 인스펙터에서 초기화 해준 후 총알 발사부에 총알을 복사하도록 선언해준다.
void Shoot()
{
Instantiate(bulletPrefab, firePoint.position, firePoint.rotation);
}
firePoint라는 빈 객체를 새로 생성해준 후 2D와 시점을 잘 사용해서 총구에 위치를 지정해준다.
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
Size over Lifetime
Collision : 활성화
만약 길 밑으로 입자가 떨어지면 길에 Box Collider이 추가되어있는지 확인해보자
Renderer
유니티 공식 문서를 참고하면 파티클 시스템 모듈로 구성된 강력한 프로퍼티에 대해 이해할 수 있다. 자세히 알아두어 추후 게임 개발에 잘 사용할 수 있도록 한다.
완성된 파티클 시스템의 효과이다
이제 Bullet 스크립트에서 이펙트가 실행되도록 오브젝트를 선언후 인스펙터에서 초기화해준 후 Play 로직을 작성한다.
void HitTarget() //총알이 적에 도달했을때
{
//이펙트 생성(실행) 후 다시 제거
GameObject effectIns = (GameObject)Instantiate(impactEffect, transform.position, transform.rotation); //이펙트 생성
Destroy(effectIns, 2f); //2초후에 이펙트 다시 삭제
Destroy(target.gameObject); //일단 바로 파괴하도록 작성 - 추후 HP 추가 예정
Destroy(gameObject); //충돌 시 총알은 바로 파괴
}
아래 결과물을 보면 알겠지만 고개가 돌아가는 중간에도 총알이 발사되서 살짝 부자연스러운 부분이 있는데 추후에 수정할 수 있으면 고개가 완전히 돌아간 다음에 bullet countdown이 작동하도록 수정하도록 한다.