Menu
CoddyTech

Eventos controlam a interface

Parte da seção Arquitetura de Jogos no Unity do Journey de Unity da Coddy. Lição 15 de 64.

Com eventos, o HUD acompanha o jogo, enquanto o jogo não sabe nada sobre o HUD. Este Health é responsável pelos pontos de vida e anuncia duas coisas: a vida mudou e chegou a 0. Ele não tem nenhum campo para uma barra, um texto ou uma tela de fim de jogo, então o mesmo componente funciona no jogador, em um inimigo que não tem HUD e em uma cena de teste:

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, na 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;
}

A barra escuta somente enquanto está ativa, usando o par OnEnable e OnDisable. O evento passa os dois números, então Show não precisa de mais nada de Health. Um GameOverScreen se inscreve em OnDied para mostrar seu painel, e um som de dano se inscreve em OnChanged, cada um em seu próprio script, sem que Health precise mudar por causa de nenhum deles. Hp { get; private set; } permite que o HUD leia a vida, mas não a altere.

Um evento informa mudanças, então, antes do primeiro golpe, a barra ainda não recebeu nada. Ela desenha a vida atual uma vez, em Start. Não em OnEnable: o Unity chama Awake e depois OnEnable objeto por objeto, sem uma ordem garantida, então OnEnable da barra pode ser executado antes de Awake de Health definir Hp, e a barra mostraria 0. Quando qualquer Start é executado, todos os Awake já foram executados.

challenge icon

Desafio

Fácil

Faça a arma anunciar suas mudanças e a HUD escutá-las.

  1. Em Gun.cs, adicione using System;, public event Action<int, int> OnAmmoChanged e public event Action<bool> OnReloading; dispare esses eventos nos locais indicados pelos comentários.
  2. Em AmmoHud.cs, inscreva-se em OnEnable e cancele a inscrição em OnDisable: ammoText mostra Ammo: 4/6, e reloadText aparece somente durante a recarga.
  3. Em Start, mostre gun.Ammo e gun.Reloading uma vez.

Pressione “Jogar” e esvazie a arma duas vezes. Depois, pressione “Verificar”.

Experimente você mesmo

using UnityEngine;
using TMPro;

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

Todas as lições de Arquitetura de Jogos no Unity

Pratique por conta própria: Playground de Unity