Menu
CoddyTech

Compte à rebours

Leçon 23 sur 25 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 appeler la vague suivante plus tôt en appuyant sur un bouton. La pause est une boucle dans une coroutine qui cède null, donc elle s’exécute une fois par image : elle décompte le temps, 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, décrémenter le compte à rebours, attendre une image
}
skipRequested = false;

Le booléen repasse à false après son utilisation, sinon chaque pause après la première se terminerait immédiatement. Mathf.CeilToInt arrondit au supérieur, donc lorsqu’il reste 2.3 secondes, le compte affiche 3. yield return StartCoroutine(Countdown()); exécute le compte à rebours et attend qu’il se termine.

challenge icon

Défi

Difficile

Décompte avant chaque vague ; un bouton permet de la lancer plus tôt.

  1. Dans WaveSpawner, ajoute countdownText sérialisé (TMP_Text) et nextWaveButton (GameObject), private bool callNow; et public void CallNextWave() { callNow = true; }.
  2. Remplace l’instruction d’arrêt par yield return StartCoroutine(Countdown()); : affiche le bouton et, tant qu’il reste du temps et que callNow n’est pas vrai, affiche Next wave in 8, arrondi à l’entier supérieur, à chaque image.
  3. Remets ensuite callNow à false, efface le texte et masque le bouton.

Appuie sur « Jouer » : le bouton Next Wave permet de passer l’attente. Puis clique sur « Vérifier ».

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 = 8f;

    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");
    }
}

Toutes les leçons de Jeu Unity : défense de tours

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