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.
Desafio
FácilFaça a arma anunciar suas mudanças e a HUD escutá-las.
- Em
Gun.cs, adicioneusing System;,public event Action<int, int> OnAmmoChangedepublic event Action<bool> OnReloading; dispare esses eventos nos locais indicados pelos comentários. - Em
AmmoHud.cs, inscreva-se emOnEnablee cancele a inscrição emOnDisable:ammoTextmostraAmmo: 4/6, ereloadTextaparece somente durante a recarga. - Em
Start, mostregun.Ammoegun.Reloadinguma 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
1Componentes, não hierarquias
Componentes pequenosUm script base de inimigoComponentes abstratosComponentes trabalhando juntosRevisão: torre modularRevisão: canhão duplo4Dados Serializados
Classes SerializáveisListas no InspectorEnums no InspectorRevisão: Tabela de LootRevisão: Sorteie o Loot2Interfaces no Unity
IDamageableInterfaces e TryGetComponentGetComponentsRevisão: tecla de interaçãoRevisão: mais próximo ao alcance5ScriptableObjects
Ativos de DadosAtributos da ArmaConfigurações CompartilhadasSalve o VentoOndas como DadosRevisão: Banco de ItensRevisão: Comprar na LojaPratique por conta própria: Playground de Unity