Menu
CoddyTech

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.

challenge icon

Défi

Moyen

Pluie 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] Drop avec les champs publics lane (un int : -1 à gauche, 0 au milieu, 1 à droite) et delay (un float : le nombre de secondes à attendre avant cette chute). En dessous, écris DropPattern, un ScriptableObject avec [CreateAssetMenu] et les champs publics blockPrefab (un GameObject), laneWidth (un float) et drops (une List<Drop>).
  • Dans Dropper, remplace les deux champs par un champ public pattern de type DropPattern. Pour chaque chute, dans l’ordre, attends son delay, puis fais tomber le bloc du pattern à la position du Dropper, décalée de lane fois laneWidth sur l’axe x. Après la dernière chute, affiche Pattern done dans 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
quiz iconTestez-vous

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