Волны
Урок 4 из 18 курса Игра в Unity: защита башен на Coddy.
Враги появляются волнами: группа врагов одного вида, расположенных вдоль пути, затем перерыв перед следующей группой. Волна состоит из нескольких чисел, поэтому это класс [System.Serializable], а спавнер хранит List<Wave>, который Inspector отображает в виде строк для заполнения. Без [System.Serializable] Unity не может сохранить Wave, Inspector не отображает список, и он остается пустым.
Для отсчета времени используется корутина: цикл, который создает объекты, а затем выполняет yield с new WaitForSeconds(...), чтобы подождать, не останавливая остальную часть игры. Фейерверк запускается залпами таким же образом, с паузой после каждого:
IEnumerator Show()
{
foreach (Salvo salvo in salvos)
{
for (int i = 0; i < salvo.rockets; i++)
{
Instantiate(rocketPrefab, launcher.position, Quaternion.identity);
yield return new WaitForSeconds(salvo.gap);
}
yield return new WaitForSeconds(pause);
}
}Теперь враги — это префабы. Поля префаба могут ссылаться только на ресурсы и объекты внутри самого префаба, поэтому массив waypoints нового врага пуст. Спавнер владеет путем и передает его каждому врагу сразу после Instantiate. Instantiate возвращает указанный ему тип, поэтому, если поле префаба имеет тип Enemy, он возвращает нового Enemy, готового к настройке.
Задание
ЛегкоТеперь Grunt и Runner — префабы, к которым добавлены Tank и Boss со своими объектами EnemyData. Объект Spawner находится на WP0. Отправляй врагов волнами:
- В
Wave.csсделай Wave сериализуемым классом с открытыми полямиenemy(Enemy: префаб),count(int) иspacing(float, количество секунд между двумя врагами). - В
WaveSpawnerдобавь три сериализованных приватных поля:waves(типList<Wave>),waypoints(массив Transform) иtimeBetweenWaves(float). - Из
Startзапусти корутину, которая проходит по волнам по порядку. Для каждой волны: подождиtimeBetweenWaves, выведи в лог номер волны, начиная с 1, в видеWave 1, затем создай еёcountврагов в первой точке маршрута, передай каждомуwaypointsи после каждого врага подождиspacing. - После последней волны выведи в лог
All waves sent.
В Inspector заполняются восемь волн игры и пауза в 8 секунд. Нажми Play и посмотри, как появляются первые волны, затем нажми Check.
Попробуйте сами
using UnityEngine;
// Будет добавлено позже: отправляет врагов по пути волнами.
public class WaveSpawner : MonoBehaviour
{
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.