Onde come dati
Fa parte della sezione Architettura dei giochi in Unity del percorso Unity di Coddy. Lezione 27 di 64.
Le ondate di un livello sono un elenco: tre soldati semplici, poi due bruti, poi un boss. Se vengono scritte nel codice di uno spawner, ogni livello ha bisogno del proprio codice. Se vengono scritte come dati, l’elenco viene inserito in un asset, un asset per livello, e uno script dello spawner legge l’asset che gli viene assegnato. Ogni voce è una classe [System.Serializable], così l’Inspector dell’asset mostra l’elenco:
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;
}È tutto in un unico file, WaveSet.cs: il ScriptableObject ha bisogno di un file con il proprio nome, mentre la semplice classe Wave può trovarsi accanto. Seleziona un asset WaveSet e l’Inspector mostra Waves con Size e le righe Element 0, Element 1, ognuna con Enemy, Count e Spacing; il pulsante + aggiunge un’ondata. Lo spawner scorre l’elenco in 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 che contiene 3 soldati semplici a distanza di 0.5 secondi e poi 2 bruti, i soldati semplici arrivano a 0, 0.5 e 1 secondo; seguono l’intervallo dopo l’ultimo soldato semplice e la pausa di 3 secondi, quindi il primo bruto arriva a 4.5 secondi. Lo spawner di Level 2 riceve un asset Level2 con ondate più difficili, e lo script rimane uguale.
Sfida
MedioTrasforma il ritmo di Dropper in una risorsa musicale.
- In
DropPattern.cs, scrivi una classeDrop[System.Serializable]conint laneefloat delaypubblici. - Sotto, scrivi
DropPattern : ScriptableObjectcon[CreateAssetMenu]eGameObject blockPrefab,float laneWidth,List<Drop> dropspubblici. - In
Dropper, usapublic DropPattern pattern;: per ogni caduta, attendidrop.delay, poi fai cadere il blocco spostato didrop.lane * pattern.laneWidthlungo x.
Premi «Gioca»: cadono quattro blocchi. Poi premi «Verifica».
Provalo tu
using System.Collections.Generic;
using UnityEngine;
// Drop (un blocco: la sua corsia e l'attesa che lo precede) e DropPattern (l'asset) vanno qui
Tutte le lezioni di Architettura dei giochi in Unity
1Componenti, non gerarchie
Componenti piccoliUno script base per i nemiciComponenti astrattiComponenti che collaboranoRipasso: torretta modulareRipasso: cannone doppio4Dati serializzati
Classi serializzabiliElenchi nell'InspectorEnum nell'InspectorRiepilogo: tabella del bottinoRiepilogo: tira il bottino2Interfacce in Unity
IDamageableInterfacce e TryGetComponentGetComponentsRiepilogo: tasto InteragisciRiepilogo: il più vicino a portata5ScriptableObjects
Asset di datiStatistiche delle armiImpostazioni condiviseSalva il ventoOnde come datiRiepilogo: database degli oggettiRiepilogo: comprare dal negozioEsercitati da solo: Playground Unity