Menu
CoddyTech

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.

challenge icon

Desafio

Fácil

Adicione a FinishLine os eventos aos quais as linhas da cena estão conectadas.

  1. Adicione using UnityEngine.Events;, public UnityEvent<int> onLap;, public UnityEvent onRaceOver; e um int privado para as voltas concluídas.
  2. Em OnTriggerEnter, quando other estiver marcado como Player, conte a volta e chame onLap.Invoke com o número de voltas concluídas.
  3. Quando atingir laps, chame onRaceOver.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

Pratique por conta própria: Playground de Unity