Огонь
Урок 9 из 18 курса Игра в Unity: защита башен на Coddy.
Башня стреляет по своей цели fireRate раз в секунду. Вместо таймера обратного отсчёта башня хранит время следующего выстрела: когда оно достигает Time.time, башня стреляет и сдвигает время следующего выстрела на 1f / fireRate секунд. Разбрызгиватель, который распыляет воду дважды в секунду:
if (Time.time >= nextSpray)
{
Spray();
nextSpray = Time.time + 1f / spraysPerSecond;
}Каждый выстрел — это Projectile, который летит к своей цели с помощью MoveTowards, следуя за ней, пока она идёт, и наносит ей урон по прибытии. Ему не нужно знать, что он попал во врага Enemy: он запрашивает у цели IDamageable — интерфейс для всего, что может получать урон, как в главе об интерфейсах. Поэтому выстрелить можно во всё, что реализует этот интерфейс.
Цель может погибнуть, пока снаряд находится в полёте, — её может уничтожить выстрел другой башни. Тогда target снаряда будет равен null, как и у любого уничтоженного объекта Unity, и снаряду больше некуда лететь, поэтому он уничтожает себя.
Задание
СреднеIDamageableобъявляетvoid TakeDamage(int amount). Реализуй этот интерфейс вEnemy: величина урона вычитается из здоровья, а при значении 0 или меньше враг уничтожается.- В
Projectileдобавь сериализованныйspeedтипа float (в префабе задано значение 12) и методpublic void Launch(Transform target, int damage), который сохраняет оба значения. ВUpdateперемещайся к цели со скоростьюspeed; по прибытии вызовиTakeDamage(damage)у его IDamageable и уничтожь снаряд. Если цель исчезла, уничтожь снаряд. - В
Towerдобавь публичный intdamage, публичный floatfireRate(выстрелов в секунду) и сериализованныйprojectilePrefab(объект Projectile). Пока у башни есть цель, стреляй не чаще, чемfireRateраз в секунду: создай снаряд немного впереди головной части, в точкеhead.position + head.forward * 0.6f, и запусти его в цель, нанеся урон, заданный для башни.
В префабе ArrowTower задан урон 2 и fireRate 1.5, а его снаряд — ArrowShot. Нажми Play, построй башни и останови первую волну, затем нажми Check.
Попробуйте сами
using UnityEngine;
// Будет добавлено позже: снаряд, летящий от башни к своей цели.
public class Projectile : MonoBehaviour
{
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.