발사
Coddy의 Unity 게임: 타워 디펜스 코스 레슨. 18개 중 9번째.
타워는 초당 fireRate회 목표물을 향해 발사합니다. 카운트다운하는 타이머 대신, 타워는 다음 발사 시각을 기억합니다. Time.time이 그 시각에 도달하면 타워는 발사하고 다음 발사 시각을 1f / fireRate초 뒤로 옮깁니다. 초당 두 번 물을 뿌리는 스프링클러의 예입니다.
if (Time.time >= nextSpray)
{
Spray();
nextSpray = Time.time + 1f / spraysPerSecond;
}각 발사체는 목표물까지 날아가는 Projectile이며, 목표물이 걸어가는 동안 MoveTowards로 따라가다가 도착하면 피해를 줍니다. 발사체는 자신이 Enemy를 명중했는지 알 필요가 없습니다. 인터페이스 챕터에서처럼, 피해를 입을 수 있는 모든 대상이 구현하는 인터페이스인 IDamageable을 목표물에 요청하므로 이를 구현한 대상이라면 무엇이든 쏠 수 있습니다.
발사체가 날아가는 도중 다른 타워의 발사에 맞아 목표물이 죽을 수 있습니다. 그러면 목표물의 target은 파괴된 모든 Unity 객체와 마찬가지로 null과 같아지고, 발사체가 더는 날아갈 곳이 없으므로 스스로 파괴됩니다.
챌린지
중급IDamageable는void TakeDamage(int amount)를 선언합니다.Enemy가 이를 구현하도록 하세요. amount만큼 체력이 감소하고, 체력이 0 이하가 되면 적이 파괴됩니다.Projectile에 직렬화된 floatspeed(프리팹에서 12로 설정)와public void Launch(Transform target, int damage)를 추가하세요. 이 메서드는 두 값을 모두 유지합니다.Update에서speed로 대상을 향해 날아가고, 도착하면 대상의 IDamageable에TakeDamage(damage)를 호출한 뒤 발사체를 파괴하세요. 대상이 사라지면 발사체를 파괴하세요.Tower에 public intdamage, public floatfireRate(초당 발사 횟수), 그리고 직렬화된projectilePrefab(Projectile)을 추가하세요. 타워가 대상을 조준하고 있는 동안 초당 최대fireRate회 발사하세요. 발사체를 머리 앞쪽,head.position + head.forward * 0.6f위치에 인스턴스화하고 타워의 damage를 사용해 대상에게 발사하세요.
ArrowTower 프리팹은 damage를 2, fireRate를 1.5로 설정하며, 발사체는 ArrowShot입니다. Play를 누르고 타워를 건설해 첫 번째 웨이브를 막은 다음 Check를 누르세요.
직접 해보기
using UnityEngine;
// 나중에 구현할 내용: 타워에서 목표물을 향해 날아가는 탄환.
public class Projectile : MonoBehaviour
{
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.