Menu
CoddyTech

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.

challenge icon

Défi

Moyen

Transforme le rythme de Dropper en ressource de morceau.

  1. Dans DropPattern.cs, écris une classe [System.Serializable] Drop avec int lane et float delay publics.
  2. En dessous, écris DropPattern : ScriptableObject avec [CreateAssetMenu] et GameObject blockPrefab, float laneWidth et List<Drop> drops publics.
  3. Dans Dropper, utilise public DropPattern pattern; : pour chaque bloc, attends drop.delay, puis fais tomber le bloc déplacé de drop.lane * pattern.laneWidth le 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

Entraînez-vous par vous-même : Playground Unity