Les vagues comme données
Fait partie de la section Architecture de jeu dans Unity du Journey Unity de Coddy. Leçon 27 sur 64.
Les vagues d’un niveau forment une liste : trois soldats, puis deux brutes, puis un boss. Si elles sont écrites dans le code d’un générateur, chaque niveau a besoin de son propre code. Si elles sont définies comme des données, la liste est stockée dans un asset, un asset par niveau, et un seul script de générateur lit l’asset qui lui est fourni. Chaque entrée est une classe [System.Serializable], ce qui permet à l’Inspector de l’asset d’afficher la liste :
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 son propre fichier, et la classe Wave ordinaire peut se trouver à côté. Sélectionne un asset WaveSet et 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 générateur 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 contenant 3 soldats espacés de 0,5 seconde, puis 2 brutes, les soldats arrivent à 0, 0,5 et 1 seconde ; le délai après le dernier soldat, puis le repos de 3 secondes, s’écoulent, et la première brute arrive à 4,5 secondes. Le générateur de Level 2 reçoit un asset Level2 avec des vagues plus difficiles, et le script reste le même.
Défi
MoyenTransforme le rythme de Dropper en ressource de morceau.
- Dans
DropPattern.cs, écris une classe[System.Serializable]Dropavecint laneetfloat delaypublics. - En dessous, écris
DropPattern : ScriptableObjectavec[CreateAssetMenu]etGameObject blockPrefab,float laneWidthetList<Drop> dropspublics. - Dans
Dropper, utilisepublic DropPattern pattern;: pour chaque bloc, attendsdrop.delay, puis fais tomber le bloc déplacé dedrop.lane * pattern.laneWidthle long de l’axe x.
Appuie sur « Jouer » : quatre blocs tombent. Puis appuie sur « Vérifier ».
Essayez vous-même
using System.Collections.Generic;
using UnityEngine;
// Drop (un bloc : sa voie et le délai qui le précède) et DropPattern (l’asset) vont ici
Toutes les leçons de Architecture de jeu dans Unity
1Des composants, pas des hiérarchies
De petits composantsUn script de base pour les ennemisComposants abstraitsDes composants qui fonctionnent ensembleRécapitulatif : tourelle modulaireRécapitulatif : canon double4Données sérialisées
Classes sérialisablesListes dans l’InspecteurÉnumérations dans l’InspecteurRécapitulatif : table de butinRécapitulatif : tirer le butin2Les interfaces dans Unity
IDamageableInterfaces et TryGetComponentGetComponentsRécapitulatif : touche d’interactionLe plus proche à portée5ScriptableObjects
Ressources de donnéesStatistiques des armesParamètres partagésSauver le ventLes vagues comme donnéesRécapitulatif : base de données des objetsRécapitulatif : acheter dans la boutique3Événements
Les événements C# dans UnityS’abonner dans OnEnableChamps UnityEventLes événements pilotent l’interfaceRécapitulatif : fenêtre de succèsRécapitulatif : minuteur de la fenêtreEntraînez-vous par vous-même : Playground Unity