Menu
CoddyTech

Vague suivante

Leçon 17 sur 18 du cours Jeu Unity : défense de tours de Coddy.

Entre les vagues, le joueur construit, et un compte à rebours indique le temps restant. Un joueur prêt peut lancer la vague suivante plus tôt à l’aide d’un bouton. La pause est une boucle dans une coroutine qui cède null, elle s’exécute donc une fois par image : elle décompte le temps restant, l’affiche et se termine lorsque le temps est écoulé ou lorsque le bouton a demandé la vague. Le bouton définit uniquement un booléen, et la boucle le lit :

while (left > 0f && !skipRequested)
{
    // afficher les secondes restantes, faire le compte à rebours, attendre une image
}
skipRequested = false;

Le booléen est remis à false après son utilisation, sinon chaque pause après la première se terminerait immédiatement. Mathf.CeilToInt arrondit à l’entier supérieur, donc 2.3 secondes restantes s’affichent comme 3, et le compte à rebours indique 1 pendant toute la dernière seconde plutôt que 0. Le compte à rebours est une coroutine à part entière, et yield return StartCoroutine(Countdown()); la lance et attend qu’elle se termine avant que la boucle des vagues continue.

Le HUD affiche également le numéro de la vague. Le spawner le connaît, et le GameManager l’affiche, donc le spawner déclenche un événement C#, WaveStarted, avec la vague et le nombre de vagues. Contrairement aux événements statiques des ennemis, il appartient à un spawner particulier, et le GameManager s’y abonne par l’intermédiaire de son champ spawner.

challenge icon

Défi

Difficile
  1. Dans WaveSpawner, ajoute les champs sérialisés countdownText (un TMP_Text) et nextWaveButton (un GameObject), ainsi que public void CallNextWave(), que le bouton appelle pour demander le lancement immédiat de la vague.
  2. Remplace l’attente avant chaque vague par un compte à rebours, exécuté avec yield return StartCoroutine(Countdown());. Pendant son exécution, le bouton s’affiche et le texte indique Next wave in 8, avec le nombre de secondes restantes arrondi à l’entier supérieur. Le compte à rebours se termine lorsque le temps est écoulé ou que le bouton a été cliqué ; le texte est alors vide et le bouton masqué.
  3. Ajoute public event Action<int, int> WaveStarted, déclenché au début d’une vague avec son numéro (à partir de 1) et le nombre total de vagues.
  4. Dans GameManager, ajoute les champs sérialisés spawner (un WaveSpawner) et waveText (un TMP_Text), abonne-toi à WaveStarted et affiche Wave 1/8.

Le HUD contient WaveText, CountdownText et NextWaveButton. Appuie sur Play, construis et lance la première vague plus tôt, puis clique sur Check.

Essayez vous-même

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class WaveSpawner : MonoBehaviour
{
    [SerializeField] private List<Wave> waves = new List<Wave>();
    [SerializeField] private Transform[] waypoints;
    [SerializeField] private float timeBetweenWaves = 5f;

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

    IEnumerator RunWaves()
    {
        for (int i = 0; i < waves.Count; i++)
        {
            yield return new WaitForSeconds(timeBetweenWaves);
            Debug.Log("Wave " + (i + 1));
            Wave wave = waves[i];
            for (int n = 0; n < wave.count; n++)
            {
                Enemy enemy = Instantiate(wave.enemy, waypoints[0].position, Quaternion.identity);
                enemy.waypoints = waypoints;
                yield return new WaitForSeconds(wave.spacing);
            }
        }
        Debug.Log("All waves sent");
    }
}
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 Jeu Unity : défense de tours