Menu
CoddyTech

Волны

Урок 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, готового к настройке.

challenge icon

Задание

Легко

Теперь Grunt и Runner — префабы, к которым добавлены Tank и Boss со своими объектами EnemyData. Объект Spawner находится на WP0. Отправляй врагов волнами:

  1. В Wave.cs сделай Wave сериализуемым классом с открытыми полями enemy (Enemy: префаб), count (int) и spacing (float, количество секунд между двумя врагами).
  2. В WaveSpawner добавь три сериализованных приватных поля: waves (тип List<Wave>), waypoints (массив Transform) и timeBetweenWaves (float).
  3. Из Start запусти корутину, которая проходит по волнам по порядку. Для каждой волны: подожди timeBetweenWaves, выведи в лог номер волны, начиная с 1, в виде Wave 1, затем создай её count врагов в первой точке маршрута, передай каждому waypoints и после каждого врага подожди spacing.
  4. После последней волны выведи в лог All waves sent.

В Inspector заполняются восемь волн игры и пауза в 8 секунд. Нажми Play и посмотри, как появляются первые волны, затем нажми Check.

Попробуйте сами

using UnityEngine;

// Будет добавлено позже: отправляет врагов по пути волнами.
public class WaveSpawner : MonoBehaviour
{
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Игра в Unity: защита башен