Menu
CoddyTech

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.

challenge icon

Desafio

Fácil

Uma 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, e onRaceOver, que não passa nada.
  • Cada vez que o carro (com a tag Player) entrar na linha, uma volta é concluída: invoque onLap com 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), invoque onRaceOver. 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
    }
}
quiz iconTeste seus conhecimentos

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