Menu
CoddyTech

Vider l’arène

Fait partie de la section Architecture de jeu dans Unity du Journey Unity de Coddy. Leçon 55 sur 64.

Un événement marqué static appartient à la classe, et non à un objet. Il existe un seul Enemy.Died pour tous les ennemis qui existeront, de sorte que le spawner peut s’y abonner avec Enemy.Died += OnEnemyDied; avant même qu’un ennemi existe, et chaque ennemi le déclenche en passant lui-même comme argument. La même idée en C# classique :

public class Coin
{
    public static event Action<Coin> Picked;

    public void Pick()
    {
        Picked?.Invoke(this);
    }
}

public class Purse
{
    private int coins;

    public Purse()
    {
        Coin.Picked += OnPicked;   // aucun Coin nécessaire pour le moment
    }

    void OnPicked(Coin coin)
    {
        coins++;
    }
}

On accède à un événement d’instance via un objet, comme avec hero.Died ; à un événement statique, via le nom de la classe, comme avec Coin.Picked. Un événement statique survit à tous les objets ; désabonne-toi donc dans OnDisable, sinon un spawner détruit reste dans sa liste.

challenge icon

Défi

Moyen

Fais attendre chaque vague jusqu’à ce que l’arène soit vide.

  1. Dans Enemy, ajoute public static event Action<Enemy> Died; et appelle Died?.Invoke(this); juste avant Destroy(gameObject);.
  2. Dans WaveSpawner, compte alive : ajoute 1 à chaque apparition et soustrais-en 1 dans une méthode que OnEnable abonne à Enemy.Died et dont OnDisable se désabonne.
  3. Après l’apparition d’une vague, attends tant que alive > 0.

Appuie sur « Jouer » et vaincs la vague 1 : la vague 2 arrive 2 secondes plus tard. Puis appuie sur « Vérifier ».

Essayez vous-même

using System.Collections;
using UnityEngine;

public class WaveSpawner : MonoBehaviour
{
    [SerializeField] private WaveSet waveSet;
    [SerializeField] private Transform[] spawnPoints;

    public int Wave { get; private set; }

    void Start()
    {
        StartCoroutine(RunWaves());
    }

    IEnumerator RunWaves()
    {
        while (true)
        {
            foreach (Wave wave in waveSet.waves)
            {
                Wave++;
                Debug.Log("Wave " + Wave);
                for (int i = 0; i < wave.count; i++)
                {
                    Transform point = spawnPoints[i % spawnPoints.Length];
                    Instantiate(wave.enemy, point.position, Quaternion.identity);
                    yield return new WaitForSeconds(wave.spacing);
                }
                yield return new WaitForSeconds(waveSet.restBetweenWaves);
            }
        }
    }
}

Toutes les leçons de Architecture de jeu dans Unity

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