Menu
CoddyTech

Gli eventi guidano l'interfaccia utente

Fa parte della sezione Architettura dei giochi in Unity del percorso Unity di Coddy. Lezione 13 di 50.

Con gli eventi, l'HUD segue il gioco, mentre il gioco non sa nulla dell'HUD. Questo componente Health possiede i punti vita e annuncia due cose: la salute è cambiata e ha raggiunto 0. Non ha campi per una barra, un testo o una schermata di fine partita, quindi lo stesso componente funziona sul giocatore, su un nemico che non ha HUD e in una scena di 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, sull'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 barra ascolta solo quando è attiva, tramite la coppia OnEnable e OnDisable. L'evento passa entrambi i numeri, quindi a Show non serve altro da Health. Una schermata GameOverScreen si iscrive a OnDied per mostrare il suo pannello e un suono di danno si iscrive a OnChanged, ciascuno nel proprio script, e Health non cambia per nessuno di loro. Hp { get; private set; } permette all'HUD di leggere la salute, ma non di modificarla.

Un evento segnala i cambiamenti, quindi prima del primo colpo la barra non ha ricevuto alcuna notifica. Disegna la salute attuale una volta, in Start. Non in OnEnable: Unity chiama Awake e poi OnEnable oggetto per oggetto, senza un ordine garantito, quindi l'OnEnable della barra può essere eseguito prima che l'Awake di Health abbia impostato Hp, e la barra mostrerebbe 0. Quando viene eseguito qualsiasi Start, tutti gli Awake sono già stati eseguiti.

challenge icon

Sfida

Facile

Un poligono di tiro. La barra spaziatrice spara con la pistola (Gun.cs), che contiene maxAmmo (6) colpi; sparare l'ultimo avvia una ricarica di reloadTime (1.5) secondi, che la riempie di nuovo. Per ora la HUD non mostra nulla di tutto questo. Fai in modo che la pistola comunichi i suoi cambiamenti e che la HUD li ascolti; la pistola non deve avere un campo per la HUD.

  • In Gun.cs, aggiungi due eventi pubblici: OnAmmoChanged, che passa le munizioni e maxAmmo (due int), e OnReloading, che passa un bool: true quando inizia una ricarica, false quando termina. Attivali nei punti indicati dai commenti.
  • In AmmoHud.cs (sulla HUD), ascolta entrambi gli eventi quando la HUD è attiva. ammoText mostra le munizioni nel formato Ammo: 4/6, e reloadText (l'oggetto con il testo Reloading...) viene mostrato solo durante una ricarica.
  • La HUD deve essere corretta fin dall'inizio, prima del primo sparo: Ammo: 6/6 e nessun testo di ricarica. Le proprietà Ammo e Reloading della pistola forniscono i valori correnti.
  • Se la HUD viene distrutta, la pistola continua a sparare senza errori.

Premi Play, svuota la pistola due volte, poi premi Check.

Provalo tu

using UnityEngine;
using TMPro;

public class AmmoHud : MonoBehaviour
{
    public Gun gun;
    public TMP_Text ammoText;
    public GameObject reloadText;
}
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Architettura dei giochi in Unity