Menu
CoddyTech

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.

challenge icon

Desafío

Fácil

Haz que la pistola anuncie sus cambios y que el HUD los escuche.

  1. En Gun.cs, añade using System;, public event Action<int, int> OnAmmoChanged y public event Action<bool> OnReloading; actívalos donde lo indiquen los comentarios.
  2. En AmmoHud.cs, suscríbete en OnEnable y cancela la suscripción en OnDisable: ammoText muestra Ammo: 4/6, y reloadText se muestra solo mientras se está recargando.
  3. En Start, muestra gun.Ammo y gun.Reloading una 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

Practica por tu cuenta: Playground de Unity