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.
Sfida
FacileFai in modo che la pistola comunichi i suoi cambiamenti e che l'HUD li ascolti.
- In
Gun.cs, aggiungiusing System;,public event Action<int, int> OnAmmoChangedepublic event Action<bool> OnReloading; attivali nei punti indicati dai commenti. - In
AmmoHud.cs, iscriviti inOnEnablee annulla l'iscrizione inOnDisable:ammoTextmostraAmmo: 4/6ereloadTextviene mostrato solo durante la ricarica. - In
Start, visualizza una voltagun.Ammoegun.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
1Componenti, non gerarchie
Componenti piccoliUno script base per i nemiciComponenti astrattiComponenti che collaboranoRipasso: torretta modulareRipasso: cannone doppio4Dati serializzati
Classi serializzabiliElenchi nell'InspectorEnum nell'InspectorRiepilogo: tabella del bottinoRiepilogo: tira il bottino2Interfacce in Unity
IDamageableInterfacce e TryGetComponentGetComponentsRiepilogo: tasto InteragisciRiepilogo: il più vicino a portata5ScriptableObjects
Asset di datiStatistiche delle armiImpostazioni condiviseSalva il ventoOnde come datiRiepilogo: database degli oggettiRiepilogo: comprare dal negozio3Eventi
Eventi C# in UnityIscrizione in OnEnableCampi UnityEventGli eventi guidano l'interfaccia utenteRiepilogo: popup dei risultatiRiepilogo: timer del popupEsercitati da solo: Playground Unity