Les événements pilotent l’interface utilisateur
Fait partie de la section Architecture de jeu dans Unity du Journey Unity de Coddy. Leçon 13 sur 50.
Avec les événements, le HUD suit le jeu tandis que le jeu ne sait rien du HUD. Ce composant Health possède les points de vie et annonce deux choses : la santé a changé et elle a atteint 0. Il n’a aucun champ pour une barre, un texte ou un écran de fin de partie, donc le même composant fonctionne 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 écoute uniquement 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 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 rien entendu. Elle dessine la santé actuelle une fois, dans Start. Pas dans OnEnable : Unity appelle Awake puis OnEnable objet par objet, sans ordre garanti, donc 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 été exécutés.
Défi
FacileUn stand de tir. La barre d’espace tire avec le pistolet (Gun.cs), qui contient maxAmmo (6) balles. Le tir de la dernière balle lance un rechargement de reloadTime (1.5) secondes, qui remplit à nouveau le chargeur. Le HUD n’affiche encore rien de tout cela. Faites en sorte que le pistolet annonce ses changements et que le HUD les écoute ; le pistolet ne doit pas avoir de champ pour le HUD.
- Dans
Gun.cs, ajoutez deux événements publics :OnAmmoChanged, qui transmet les munitions etmaxAmmo(deux entiers), etOnReloading, qui transmet un booléen : true quand le rechargement commence, false quand il se termine. Déclenchez-les aux endroits indiqués par les commentaires. - Dans
AmmoHud.cs(sur le HUD), écoutez les deux événements tant que le HUD est actif.ammoTextaffiche les munitions sous la formeAmmo: 4/6, etreloadText(l’objet contenant le texteReloading...) s’affiche uniquement pendant un rechargement. - Le HUD est correct dès le départ, avant le premier tir :
Ammo: 6/6et aucun texte de rechargement. Les propriétésAmmoetReloadingdu pistolet donnent les valeurs actuelles. - Si le HUD est détruit, le pistolet continue de tirer sans erreur.
Appuyez sur Play, videz le chargeur deux fois, puis cliquez sur Check.
Essayez vous-même
using UnityEngine;
using TMPro;
public class AmmoHud : MonoBehaviour
{
public Gun gun;
public TMP_Text ammoText;
public GameObject reloadText;
}
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Architecture de jeu dans Unity
1Des composants, pas des hiérarchies
Des composants simplesUn script de base pour les ennemisDes composants abstraitsDes composants qui fonctionnent ensembleRécapitulatif : tourelle modulaire4Données sérialisées
Classes sérialisablesListes dans l’inspecteurÉnumérations dans l’inspecteurRécapitulatif : table de butin7Machines à états
Les états sous forme de classesUne machine à étatsTransitionsLes cerveaux des ennemisRécapitulatif : états d’une porte10Projet : Survivant de l’arène
Le hérosTypes d’ennemis2Interfaces dans Unity
IDamageableInterfaces et TryGetComponentGetComponentsRécapitulatif : touche d’interaction5ScriptableObjects
Assets de donnéesStatistiques des armesParamètres partagésLes vagues sous forme de donnéesRécapitulatif : base de données d’objets3Événements
Événements C# dans UnityS’abonner dans OnEnableChamps UnityEventLes événements pilotent l’interface utilisateurRécapitulatif : fenêtre contextuelle de succès