Oleadas como datos
Parte de la sección Arquitectura de juegos en Unity del Journey de Unity de Coddy. Lección 22 de 50.
Las oleadas de un nivel son una lista: tres soldados rasos, después dos brutos y, por último, un jefe. Escrita en el código de un generador, cada nivel necesita su propio código. Escrita como datos, la lista se incluye en un recurso, un recurso por nivel, y un único script de generador lee el recurso que se le proporciona. Cada entrada es una clase [System.Serializable], por lo que el Inspector del recurso muestra la lista:
using System.Collections.Generic;
using UnityEngine;
[System.Serializable]
public class Wave
{
public GameObject enemy;
public int count = 1;
public float spacing = 1f;
}
[CreateAssetMenu(menuName = "Game/Wave Set")]
public class WaveSet : ScriptableObject
{
public List<Wave> waves;
public float restBetweenWaves = 3f;
}Todo esto está en un único archivo, WaveSet.cs: el ScriptableObject necesita un archivo con su propio nombre, y la clase sencilla Wave puede estar junto a él. Selecciona un recurso WaveSet y el Inspector muestra Waves con su Size y las filas Element 0, Element 1, cada una con Enemy, Count y Spacing; el botón + añade una oleada. El generador recorre la lista en una coroutine:
public class WaveSpawner : MonoBehaviour
{
public WaveSet waveSet;
void Start()
{
StartCoroutine(SendWaves());
}
IEnumerator SendWaves()
{
foreach (Wave wave in waveSet.waves)
{
for (int i = 0; i < wave.count; i++)
{
Instantiate(wave.enemy, transform.position, Quaternion.identity);
yield return new WaitForSeconds(wave.spacing);
}
yield return new WaitForSeconds(waveSet.restBetweenWaves);
}
Debug.Log("Last wave sent");
}
}Con Level1 configurado con 3 soldados rasos separados por 0.5 segundos y después 2 brutos, los soldados rasos aparecen a los 0, 0.5 y 1 segundos; después vienen el intervalo tras el último soldado raso y la pausa de 3 segundos, y el primer bruto aparece a los 4.5 segundos. El generador del nivel 2 recibe un recurso Level2 con oleadas más difíciles, y el script sigue siendo el mismo.
Desafío
IntermedioLluvia de bloques: los bloques caen del cielo siguiendo un ritmo y los esquivas con las flechas. Dropper deja caer un bloque en cada carril de su matriz lanes, siempre con 1 segundo de separación. Convierte el ritmo en datos para que cada canción pueda ser un recurso:
- En
DropPattern.cs, escribe una clase[System.Serializable]llamadaDropcon los campos públicoslane(un int: -1 izquierda, 0 centro, 1 derecha) ydelay(un float: los segundos que hay que esperar antes de esta caída). Debajo, escribeDropPattern, un ScriptableObject con[CreateAssetMenu]y los campos públicosblockPrefab(un GameObject),laneWidth(un float) ydrops(unList<Drop>). - En
Dropper, reemplaza ambos campos por un campo públicopatternde tipo DropPattern. Para cada caída, en orden, espera el tiempo indicado pordelayy después deja caer el bloque del patrón en la posición de Dropper, desplazadalaneveceslaneWidtha lo largo del eje x. Después de la última caída, registraPattern done.
El proyecto tiene un recurso Song1: ancho de carril 2 y cuatro caídas; el Inspector lo asigna al campo pattern de Dropper. Pulsa Play y esquiva los bloques; después, Check.
Pruébalo tú mismo
using System.Collections.Generic;
using UnityEngine;
// Drop (un bloque: su carril y la espera previa) y DropPattern (el recurso) van aquí
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Arquitectura de juegos en Unity
1Componentes, no jerarquías
Componentes pequeñosUn script base para enemigosComponentes abstractosComponentes que trabajan juntosRepaso: torreta modular4Datos serializados
Clases serializablesListas en el InspectorEnumeraciones en el InspectorRepaso: tabla de botín7Máquinas de estados
Estados como clasesUna máquina de estadosTransicionesCerebros de enemigosRepaso: estados de puertas10Proyecto: Superviviente de la arena
El héroeTipos de enemigos2Interfaces en Unity
IDamageableInterfaces y TryGetComponentGetComponentsRepaso: tecla de interacción5ScriptableObjects
Recursos de datosEstadísticas de armasConfiguración compartidaOleadas como datosRepaso: base de datos de objetos