Menu
CoddyTech

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.

challenge icon

Défi

Facile

Un 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 et maxAmmo (deux entiers), et OnReloading, 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. ammoText affiche les munitions sous la forme Ammo: 4/6, et reloadText (l’objet contenant le texte Reloading...) s’affiche uniquement pendant un rechargement.
  • Le HUD est correct dès le départ, avant le premier tir : Ammo: 6/6 et aucun texte de rechargement. Les propriétés Ammo et Reloading du 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;
}
quiz iconTestez-vous

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