Los eventos controlan la interfaz
Parte de la sección Arquitectura de juegos en Unity del Journey de Unity de Coddy. Lección 15 de 64.
Con los eventos, el HUD sigue al juego mientras que el juego no sabe nada del HUD. Este componente Health es propietario de los puntos de vida y anuncia dos cosas: que la salud cambió y que llegó a 0. No tiene ningún campo para una barra, un texto o una pantalla de fin de partida, así que el mismo componente funciona en el jugador, en un enemigo que no tiene HUD y en una escena de prueba:
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, en el 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 escucha solo mientras está activa, con el par OnEnable y OnDisable. El evento pasa ambos números, así que Show no necesita nada más de Health. Una pantalla GameOverScreen se suscribe a OnDied para mostrar su panel, y un sonido de daño se suscribe a OnChanged; cada uno lo hace en su propio script, y Health no cambia para ninguno de ellos. Hp { get; private set; } permite que el HUD lea la salud, pero no que la cambie.
Un evento informa de los cambios, así que antes del primer impacto la barra no ha recibido ninguna notificación. Dibuja la salud actual una vez, en Start. No en OnEnable: Unity llama a Awake y después a OnEnable para cada objeto, sin garantizar el orden, así que el OnEnable de la barra puede ejecutarse antes de que el Awake de Health haya establecido Hp, y la barra mostraría 0. Para cuando se ejecuta cualquier Start, ya se han ejecutado todos los Awake.
Desafío
FácilHaz que la pistola anuncie sus cambios y que el HUD los escuche.
- En
Gun.cs, añadeusing System;,public event Action<int, int> OnAmmoChangedypublic event Action<bool> OnReloading; actívalos donde lo indiquen los comentarios. - En
AmmoHud.cs, suscríbete enOnEnabley cancela la suscripción enOnDisable:ammoTextmuestraAmmo: 4/6, yreloadTextse muestra solo mientras se está recargando. - En
Start, muestragun.Ammoygun.Reloadinguna vez.
Pulsa «Jugar» y vacía la pistola dos veces. Después, pulsa «Comprobar».
Pruébalo tú mismo
using UnityEngine;
using TMPro;
public class AmmoHud : MonoBehaviour
{
public Gun gun;
public TMP_Text ammoText;
public GameObject reloadText;
}
Todas las lecciones de Arquitectura de juegos en Unity
1Componentes, no jerarquías
Componentes pequeñosUn script base para enemigosComponentes abstractosComponentes que trabajan juntosRepaso: torreta modularRepaso: cañón doble4Datos serializados
Clases serializablesListas en el InspectorEnumeraciones en el InspectorRepaso: tabla de botínRepaso: sortear el botín2Interfaces en Unity
IDamageableInterfaces y TryGetComponentGetComponentsRepaso: Tecla de interacciónRepaso: El más cercano al alcance5ScriptableObjects
Activos de datosEstadísticas de armasConfiguración compartidaGuardar el vientoOleadas como datosRepaso: base de datos de objetosRepaso: comprar en la tienda3Eventos
Eventos de C# en UnitySuscribirse en OnEnableCampos UnityEventLos eventos controlan la interfazRepaso: ventana emergente de logrosRepaso: temporizador de la ventana emergentePractica por tu cuenta: Playground de Unity