Oleadas
Lección 4 de 18 del curso Juego de Unity: defensa de torres de Coddy.
Los enemigos aparecen en oleadas: un grupo de un tipo, espaciados a lo largo del camino, después un descanso antes del siguiente grupo. Una oleada consta de unos pocos números, así que es una clase [System.Serializable], y el generador de oleadas mantiene un List<Wave> que el Inspector muestra como filas para rellenar. Sin [System.Serializable], Unity no puede guardar una Wave, el Inspector no muestra la lista y esta permanece vacía.
La temporización se gestiona con una corrutina: un bucle que genera elementos y después cede el control con new WaitForSeconds(...) para esperar sin detener el resto del juego. Un espectáculo de fuegos artificiales funciona de la misma manera con sus salvas, con una pausa después de cada una:
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);
}
}Ahora los enemigos son prefabricados. Los campos de un prefabricado solo pueden apuntar a recursos y a objetos dentro del prefabricado, así que el arreglo waypoints de un enemigo nuevo está vacío. El generador de oleadas es dueño del camino y se lo pasa a cada enemigo justo después de Instantiate. Instantiate devuelve el tipo que se le proporciona, así que con un campo de prefabricado de tipo Enemy devuelve el nuevo Enemy, listo para configurarlo.
Desafío
FácilGrunt y Runner ahora son prefabs, junto con Tank y Boss, cada uno con su propio EnemyData. El objeto Spawner está en WP0. Envía a los enemigos en oleadas:
- En
Wave.cs, convierte Wave en una clase serializable con los campos públicosenemy(un Enemy: el prefab),count(un int) yspacing(un float, los segundos entre dos enemigos). - En
WaveSpawner, añade tres campos privados serializados:waves(unaList<Wave>),waypoints(un array de Transform) ytimeBetweenWaves(un float). - Desde
Start, ejecuta una coroutine que recorra las oleadas en orden. Para cada una: esperatimeBetweenWaves, registra el número de la oleada empezando por 1, comoWave 1, luego genera suscountenemigos en el primer waypoint, asignawaypointsa cada uno y esperaspacingdespués de cada enemigo. - Después de la última oleada, registra
All waves sent.
El Inspector rellena las ocho oleadas del juego y una pausa de 8 segundos. Pulsa Play y observa cómo llegan las primeras oleadas; después, pulsa Check.
Pruébalo tú mismo
using UnityEngine;
// Se implementará más adelante: envía a los enemigos por el camino en oleadas.
public class WaveSpawner : MonoBehaviour
{
}
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.