Les vagues sous forme de données
Fait partie de la section Architecture de jeu dans Unity du Journey Unity de Coddy. Leçon 22 sur 50.
Les vagues d’un niveau forment une liste : trois fantassins, puis deux brutes, puis un boss. Écrite dans le code d’un spawner, chaque niveau a besoin de son propre code. Écrite sous forme de données, la liste est placée dans un asset, un asset par niveau, et un seul script de spawner lit l’asset qui lui est fourni. Chaque entrée est une classe [System.Serializable], afin que la liste s’affiche dans l’Inspector de l’asset :
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;
}Tout cela se trouve dans un seul fichier, WaveSet.cs : le ScriptableObject doit avoir un fichier portant son propre nom, et la classe Wave ordinaire peut se trouver à côté. Sélectionne un asset WaveSet : l’Inspector affiche Waves avec sa taille et les lignes Element 0, Element 1, chacune avec Enemy, Count et Spacing ; le bouton + ajoute une vague. Le spawner parcourt la liste dans une 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");
}
}Avec Level1 qui contient 3 fantassins espacés de 0.5 seconde, puis 2 brutes, les fantassins arrivent à 0, 0.5 et 1 seconde ; l’intervalle après le dernier fantassin et le repos de 3 secondes suivent, puis la première brute arrive à 4.5 secondes. Le spawner de Level 2 reçoit un asset Level2 avec des vagues plus difficiles, et le script reste le même.
Défi
MoyenPluie de blocs : les blocs tombent du ciel en rythme, et tu les esquives avec les flèches. Le Dropper fait tomber un bloc dans chaque voie de son tableau lanes, toujours à 1 seconde d’intervalle. Transforme le rythme en données, afin que chaque chanson puisse être un asset :
- Dans
DropPattern.cs, écris une classe[System.Serializable]Dropavec les champs publicslane(un int : -1 à gauche, 0 au milieu, 1 à droite) etdelay(un float : le nombre de secondes à attendre avant cette chute). En dessous, écrisDropPattern, un ScriptableObject avec[CreateAssetMenu]et les champs publicsblockPrefab(un GameObject),laneWidth(un float) etdrops(uneList<Drop>). - Dans
Dropper, remplace les deux champs par un champ publicpatternde type DropPattern. Pour chaque chute, dans l’ordre, attends sondelay, puis fais tomber le bloc du pattern à la position du Dropper, décalée delanefoislaneWidthsur l’axe x. Après la dernière chute, affichePattern donedans le journal.
Le projet contient un asset Song1 : largeur de voie de 2 et quatre chutes, et l’Inspector le place dans le champ pattern du Dropper. Appuie sur Play et esquive, puis sur Check.
Essayez vous-même
using System.Collections.Generic;
using UnityEngine;
// Drop (un bloc : sa voie et le temps d'attente qui le précède) et DropPattern (la ressource) vont ici
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Architecture de jeu dans Unity
1Des composants, pas des hiérarchies
Des composants simplesUn script de base pour les ennemisDes composants abstraitsDes composants qui fonctionnent ensembleRécapitulatif : tourelle modulaire4Données sérialisées
Classes sérialisablesListes dans l’inspecteurÉnumérations dans l’inspecteurRécapitulatif : table de butin7Machines à états
Les états sous forme de classesUne machine à étatsTransitionsLes cerveaux des ennemisRécapitulatif : états d’une porte10Projet : Survivant de l’arène
Le hérosTypes d’ennemis2Interfaces dans Unity
IDamageableInterfaces et TryGetComponentGetComponentsRécapitulatif : touche d’interaction5ScriptableObjects
Assets de donnéesStatistiques des armesParamètres partagésLes vagues sous forme de donnéesRécapitulatif : base de données d’objets