Menu
CoddyTech

Gli eventi guidano l'interfaccia utente

Fa parte della sezione Architettura dei giochi in Unity del percorso Unity di Coddy. Lezione 15 di 64.

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 senza 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 mentre è attiva, grazie alla coppia OnEnable e OnDisable. L'evento passa entrambi i numeri, quindi Show non ha bisogno di altro da Health. Una schermata di fine partita si iscrive a OnDied per mostrare il suo pannello e un suono di ferimento si iscrive a OnChanged, ciascuno nel proprio script, e Health non cambia per nessuno dei due. 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 nulla. 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 OnEnable della barra può essere eseguito prima che Awake di Health abbia impostato Hp, e la barra mostrerebbe 0. Quando viene eseguito Start, tutti gli Awake sono già stati eseguiti.

challenge icon

Sfida

Facile

Fai in modo che la pistola comunichi i suoi cambiamenti e che l'HUD li ascolti.

  1. In Gun.cs, aggiungi using System;, public event Action<int, int> OnAmmoChanged e public event Action<bool> OnReloading; attivali nei punti indicati dai commenti.
  2. In AmmoHud.cs, iscriviti in OnEnable e annulla l'iscrizione in OnDisable: ammoText mostra Ammo: 4/6 e reloadText viene mostrato solo durante la ricarica.
  3. In Start, visualizza una volta gun.Ammo e gun.Reloading.

Premi «Gioca» e svuota la pistola due volte. Poi premi «Verifica».

Provalo tu

using UnityEngine;
using TMPro;

public class AmmoHud : MonoBehaviour
{
    public Gun gun;
    public TMP_Text ammoText;
    public GameObject reloadText;
}

Tutte le lezioni di Architettura dei giochi in Unity

Esercitati da solo: Playground Unity