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.
Défi
MoyenFais attendre chaque vague jusqu’à ce que l’arène soit vide.
- Dans
Enemy, ajoutepublic static event Action<Enemy> Died;et appelleDied?.Invoke(this);juste avantDestroy(gameObject);. - Dans
WaveSpawner, comptealive: ajoute 1 à chaque apparition et soustrais-en 1 dans une méthode queOnEnableabonne àEnemy.Diedet dontOnDisablese désabonne. - 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
1Des composants, pas des hiérarchies
De petits composantsUn script de base pour les ennemisComposants abstraitsDes composants qui fonctionnent ensembleRécapitulatif : tourelle modulaireRécapitulatif : canon double4Données sérialisées
Classes sérialisablesListes dans l’InspecteurÉnumérations dans l’InspecteurRécapitulatif : table de butinRécapitulatif : tirer le butin7Machines à états
Les états sous forme de classesL’état d’alerteUne machine à étatsTransitionsL’intelligence des ennemisLe chevalier attaqueRécapitulatif : états des portes10Projet : Survivant de l’arène
Le hérosTypes d’ennemis2Les interfaces dans Unity
IDamageableInterfaces et TryGetComponentGetComponentsRécapitulatif : touche d’interactionLe plus proche à portée5ScriptableObjects
Ressources de donnéesStatistiques des armesParamètres partagésSauver le ventLes vagues comme donnéesRécapitulatif : base de données des objetsRécapitulatif : acheter dans la boutique3Événements
Les événements C# dans UnityS’abonner dans OnEnableChamps UnityEventLes événements pilotent l’interfaceRécapitulatif : fenêtre de succèsRécapitulatif : minuteur de la fenêtreEntraînez-vous par vous-même : Playground Unity