Campos de UnityEvent
Parte da seção Arquitetura de Jogos no Unity do Journey de Unity da Coddy. Lição 14 de 64.
O evento On Click () de um botão é um campo UnityEvent, e seus próprios scripts também podem ter um. Um campo UnityEvent público aparece no Inspector como o mesmo tipo de lista, e o script o dispara com Invoke() sem saber o que está conectado a ele. Esta contagem regressiva avança uma vez por segundo:
using UnityEngine;
using UnityEngine.Events;
public class Countdown : MonoBehaviour
{
public int seconds = 3;
public UnityEvent<int> onTick;
public UnityEvent onFinished;
void Start()
{
InvokeRepeating("Tick", 1f, 1f);
}
void Tick()
{
seconds--;
onTick.Invoke(seconds);
if (seconds == 0)
{
CancelInvoke("Tick");
onFinished.Invoke();
}
}
}No Inspector, Ao Terminar () aceita linhas como as de um botão: uma linha lança o foguete, outra abre o portão. Outro nível reutiliza o mesmo Countdown com outras linhas, e ninguém precisa escrever um novo script. UnityEvent<int> passa um valor. No menu suspenso, um método que recebe um int aparece em int Dinâmico, e essa linha recebe o valor passado para Invoke, neste caso, os segundos restantes. O mesmo método em Parâmetros Estáticos recebe, em vez disso, um número digitado na linha; também é possível conectar métodos sem parâmetros.
O Unity cria um campo UnityEvent ao carregar o script, então onTick nunca é null e não precisa de ?., e o código pode adicionar ouvintes com onTick.AddListener(ShowSeconds). Escolha um UnityEvent quando a reação variar de um objeto para outro e for configurada no Inspector por você ou por um designer que nunca abre o script. Escolha um evento C# quando o código for o ouvinte: o compilador verifica os nomes dos métodos, então uma renomeação causa uma falha na compilação, em vez de deixar uma linha <Missing> silenciosa, e um evento C# nunca aparece no Inspector.
Desafio
FácilAdicione a FinishLine os eventos aos quais as linhas da cena estão conectadas.
- Adicione
using UnityEngine.Events;,public UnityEvent<int> onLap;,public UnityEvent onRaceOver;e um int privado para as voltas concluídas. - Em
OnTriggerEnter, quandootherestiver marcado comoPlayer, conte a volta e chameonLap.Invokecom o número de voltas concluídas. - Quando atingir
laps, chameonRaceOver.Invoke(); depois disso, cruzar a linha não faz nada.
Pressione “Jogar” e dirija por três voltas. Depois, pressione “Verificar”.
Experimente você mesmo
using UnityEngine;
public class FinishLine : MonoBehaviour
{
public int laps = 3;
void OnTriggerEnter(Collider other)
{
// o carro cruzou a linha: mais uma volta completada
}
}
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