Campos de UnityEvent
Parte da seção Arquitetura de jogos no Unity do Journey de Unity da Coddy. Lição 12 de 50.
O 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 aciona 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, On Finished () 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 escreve um novo script. UnityEvent<int> passa um valor. No menu suspenso, um método que recebe um int aparece em Dynamic int, e essa linha recebe o valor passado para Invoke, neste caso, os segundos restantes. O mesmo método em Static Parameters recebe, em vez disso, um número digitado na linha, e métodos sem parâmetros também podem ser conectados.
O Unity cria um campo UnityEvent quando carrega o script, então onTick nunca é null e não precisa de ?., e o código pode adicionar listeners 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 responsável por escutar: o compilador verifica os nomes dos métodos, então uma renomeação interrompe a compilação em vez de deixar uma linha silenciosa <Missing>, e um evento C# nunca aparece no Inspector.
Desafio
FácilUma corrida de três voltas ao redor da ilha. As setas dirigem o carro (Car.cs), e a cena está configurada da maneira como um designer faria no Inspector: a lista On Lap (Int32) do FinishLine chama LapBoard.ShowLaps (Dynamic int) no LapText e Crowd.Cheer na Crowd, e a lista On Race Over () chama LapBoard.ShowFinished e Car.Stop. Esses scripts estão prontos, mas não há nada para conectar às linhas até que o FinishLine tenha os eventos.
Escreva FinishLine.cs:
- Dois campos UnityEvent:
onLap, que passa um int, eonRaceOver, que não passa nada. - Cada vez que o carro (com a tag
Player) entrar na linha, uma volta é concluída: invoqueonLapcom o número de voltas concluídas (1, depois 2, depois 3). Nada mais que atravesse a linha conta. - Quando o número de voltas concluídas chegar a
laps(3), invoqueonRaceOver. Depois disso, atravessar a linha não faz nada.
Pressione Play, dirija três voltas ao redor da ilha e, em seguida, Check.
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 concluída
}
}
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Arquitetura de jogos no Unity
1Componentes, não hierarquias
Componentes pequenosUm script-base para inimigosComponentes abstratosComponentes trabalhando juntosRevisão: Torre modular4Dados Serializados
Classes SerializáveisListas no InspectorEnums no InspectorRevisão: Tabela de Loot7Máquinas de Estados
Estados como ClassesUma Máquina de EstadosTransiçõesInteligências dos InimigosRevisão: Estados da Porta10Projeto: Sobrevivente da Arena
O HeróiTipos de Inimigos5ScriptableObjects
Assets de dadosAtributos das armasConfigurações compartilhadasOndas como dadosRevisão: banco de dados de itens3Eventos
Eventos de C# no UnityInscreva-se em OnEnableCampos de UnityEventEventos controlam a interfaceRevisão: janela de conquista