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.
Défi
Difficile- Dans
WaveSpawner, ajoute les champs sérialiséscountdownText(un TMP_Text) etnextWaveButton(un GameObject), ainsi quepublic void CallNextWave(), que le bouton appelle pour demander le lancement immédiat de la vague. - 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 indiqueNext 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é. - 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. - Dans
GameManager, ajoute les champs sérialisésspawner(un WaveSpawner) etwaveText(un TMP_Text), abonne-toi à WaveStarted et afficheWave 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");
}
}
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.