Menu
CoddyTech

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.

challenge icon

Desafío

Intermedio

Lluvia 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] llamada Drop con los campos públicos lane (un int: -1 izquierda, 0 centro, 1 derecha) y delay (un float: los segundos que hay que esperar antes de esta caída). Debajo, escribe DropPattern, un ScriptableObject con [CreateAssetMenu] y los campos públicos blockPrefab (un GameObject), laneWidth (un float) y drops (un List<Drop>).
  • En Dropper, reemplaza ambos campos por un campo público pattern de tipo DropPattern. Para cada caída, en orden, espera el tiempo indicado por delay y después deja caer el bloque del patrón en la posición de Dropper, desplazada lane veces laneWidth a lo largo del eje x. Después de la última caída, registra Pattern 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í
quiz iconPonte a prueba

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