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.
Sfida
FacileUn 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 emaxAmmo(due int), eOnReloading, 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.ammoTextmostra le munizioni nel formatoAmmo: 4/6, ereloadText(l'oggetto con il testoReloading...) viene mostrato solo durante una ricarica. - La HUD deve essere corretta fin dall'inizio, prima del primo sparo:
Ammo: 6/6e nessun testo di ricarica. Le proprietàAmmoeReloadingdella 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;
}
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
1Componenti, non gerarchie
Componenti piccoliUno script base per i nemiciComponenti astrattiComponenti che collaboranoRiepilogo: torretta modulare4Dati serializzati
Classi serializzabiliListe nell'InspectorEnum nell'InspectorRiepilogo: tabella del bottino7Macchine a stati
Gli stati come classiUna macchina a statiTransizioniIntelligenze dei nemiciRiepilogo: stati della porta10Progetto: Sopravvissuto nell’arena
L’eroeTipi di nemici5ScriptableObjects
Asset di datiStatistiche delle armiImpostazioni condiviseOndate come datiRiepilogo: database degli oggetti3Eventi
Eventi C# in UnityIscriviti in OnEnableCampi UnityEventGli eventi guidano l'interfaccia utenteRiepilogo: popup dell'obiettivo