Les événements pilotent l’interface
Fait partie de la section Architecture de jeu dans Unity du Journey Unity de Coddy. Leçon 15 sur 64.
Avec les événements, le HUD suit le jeu, tandis que le jeu ne sait rien du HUD. Ce composant Health gère les points de vie et annonce deux choses : la santé a changé, et elle a atteint 0. Il ne possède aucun champ pour une barre, un texte ou un écran de fin de partie ; le même composant fonctionne donc sur le joueur, sur un ennemi qui n’a pas de HUD et dans une scène de test :
public class Health : MonoBehaviour
{
public int maxHp = 100;
public event Action<int, int> OnChanged;
public event Action OnDied;
public int Hp { get; private set; }
void Awake()
{
Hp = maxHp;
}
public void TakeDamage(int amount)
{
if (Hp == 0) return;
Hp = Mathf.Max(Hp - amount, 0);
OnChanged?.Invoke(Hp, maxHp);
if (Hp == 0) OnDied?.Invoke();
}
}// HealthBar.cs, sur le HUD
public Health health;
public Image bar;
void OnEnable() { health.OnChanged += Show; }
void OnDisable() { health.OnChanged -= Show; }
void Start()
{
Show(health.Hp, health.maxHp);
}
void Show(int hp, int max)
{
bar.fillAmount = (float)hp / max;
}La barre n’écoute que lorsqu’elle est active, grâce à la paire OnEnable et OnDisable. L’événement transmet les deux nombres, donc Show n’a besoin de rien d’autre venant de Health. Un GameOverScreen s’abonne à OnDied pour afficher son panneau, et un son de blessure s’abonne à OnChanged ; chacun se trouve dans son propre script, et Health ne change pour aucun d’eux. Hp { get; private set; } permet au HUD de lire la santé, mais pas de la modifier.
Un événement signale les changements ; avant le premier coup, la barre n’a donc encore rien entendu. Elle dessine la santé actuelle une fois, dans Start. Pas dans OnEnable : Unity appelle Awake puis OnEnable pour chaque objet, dans un ordre qui n’est pas garanti. Ainsi, le OnEnable de la barre peut s’exécuter avant que le Awake de Health ait défini Hp, et la barre afficherait 0. Au moment où le moindre Start s’exécute, tous les Awake ont déjà été appelés.
Défi
FacileFais en sorte que le pistolet annonce ses changements et que le HUD les écoute.
- Dans
Gun.cs, ajouteusing System;,public event Action<int, int> OnAmmoChangedetpublic event Action<bool> OnReloading; déclenche ces événements aux endroits indiqués par les commentaires. - Dans
AmmoHud.cs, abonne-toi dansOnEnableet désabonne-toi dansOnDisable:ammoTextafficheAmmo: 4/6, etreloadTexts’affiche uniquement pendant le rechargement. - Dans
Start, affiche une foisgun.Ammoetgun.Reloading.
Appuie sur « Jouer » et vide le chargeur deux fois. Puis clique sur « Vérifier ».
Essayez vous-même
using UnityEngine;
using TMPro;
public class AmmoHud : MonoBehaviour
{
public Gun gun;
public TMP_Text ammoText;
public GameObject reloadText;
}
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 butin2Les 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