Oleadas como datos
Parte de la sección Arquitectura de juegos en Unity del Journey de Unity de Coddy. Lección 27 de 64.
Las oleadas de un nivel son una lista: tres soldados rasos, después dos brutos y después un jefe. Si se escriben en el código de un generador, cada nivel necesita su propio código. Si se escriben 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 proporcione. Cada entrada es una clase [System.Serializable], así 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 va en un único archivo, WaveSet.cs: el ScriptableObject necesita un archivo con su propio nombre, y la clase sencilla Wave puede ir 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 corrutina:
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");
}
}Si Level1 contiene 3 soldados rasos con 0.5 segundos de separación y después 2 brutos, los soldados rasos aparecen a los 0, 0.5 y 1 segundo; después del último soldado raso transcurren el intervalo entre apariciones y los 3 segundos de descanso, y el primer bruto aparece a los 4.5 segundos. El generador de Level 2 recibe un recurso Level2 con oleadas más difíciles, y el script sigue siendo el mismo.
Desafío
IntermedioConvierte el ritmo de Dropper en un recurso de canción.
- En
DropPattern.cs, escribe una clase[System.Serializable]Dropconint laneyfloat delaypúblicos. - Debajo, escribe
DropPattern : ScriptableObjectcon[CreateAssetMenu]yGameObject blockPrefab,float laneWidth,List<Drop> dropspúblicos. - En
Dropper, usapublic DropPattern pattern;: para cada caída, esperadrop.delayy después deja caer el bloque desplazadodrop.lane * pattern.laneWidtha lo largo del eje x.
Pulsa «Jugar»: caen cuatro bloques. Después, pulsa «Comprobar».
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í
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 modularRepaso: cañón doble4Datos serializados
Clases serializablesListas en el InspectorEnumeraciones en el InspectorRepaso: tabla de botínRepaso: sortear el botín2Interfaces en Unity
IDamageableInterfaces y TryGetComponentGetComponentsRepaso: Tecla de interacciónRepaso: El más cercano al alcance5ScriptableObjects
Activos de datosEstadísticas de armasConfiguración compartidaGuardar el vientoOleadas como datosRepaso: base de datos de objetosRepaso: comprar en la tienda3Eventos
Eventos de C# en UnitySuscribirse en OnEnableCampos UnityEventLos eventos controlan la interfazRepaso: ventana emergente de logrosRepaso: temporizador de la ventana emergentePractica por tu cuenta: Playground de Unity