Menu
CoddyTech

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.

challenge icon

Défi

Facile

Fais en sorte que le pistolet annonce ses changements et que le HUD les écoute.

  1. Dans Gun.cs, ajoute using System;, public event Action<int, int> OnAmmoChanged et public event Action<bool> OnReloading ; déclenche ces événements aux endroits indiqués par les commentaires.
  2. Dans AmmoHud.cs, abonne-toi dans OnEnable et désabonne-toi dans OnDisable : ammoText affiche Ammo: 4/6, et reloadText s’affiche uniquement pendant le rechargement.
  3. Dans Start, affiche une fois gun.Ammo et gun.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

Entraînez-vous par vous-même : Playground Unity