Menu
CoddyTech

Campos UnityEvent

Parte de la sección Arquitectura de juegos en Unity del Journey de Unity de Coddy. Lección 14 de 64.

On Click () de un botón es un campo UnityEvent, y tus propios scripts también pueden tener uno. Un campo público UnityEvent aparece en el Inspector como el mismo tipo de lista, y el script lo activa con Invoke() sin saber qué está conectado a él. Esta cuenta atrás avanza una 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();
        }
    }
}

En el Inspector, On Finished () admite filas como las de un botón: una fila lanza el cohete y otra abre la puerta. Otro nivel reutiliza el mismo Countdown con otras filas, y nadie escribe un script nuevo. UnityEvent<int> pasa un valor. En su menú desplegable, un método que recibe un int aparece en Dynamic int, y esa fila recibe el valor proporcionado a Invoke, en este caso, los segundos restantes. El mismo método, en Static Parameters, recibe en cambio un número escrito en la fila; también se pueden conectar métodos sin parámetros.

Unity crea un campo UnityEvent cuando carga el script, así que onTick nunca es null y no necesita ?., y el código puede añadir oyentes con onTick.AddListener(ShowSeconds). Elige un UnityEvent cuando la reacción varía de un objeto a otro y se configura en el Inspector, por ti o por un diseñador que nunca abre el script. Elige un evento de C# cuando el código escucha: el compilador comprueba los nombres de los métodos, así que cambiar un nombre provoca un error de compilación en lugar de dejar una fila <Missing> sin avisar, y un evento de C# nunca aparece en el Inspector.

challenge icon

Desafío

Fácil

Asigna a FinishLine los eventos a los que están conectadas las filas de la escena.

  1. Añade using UnityEngine.Events;, public UnityEvent<int> onLap;, public UnityEvent onRaceOver; y un int privado para las vueltas completadas.
  2. En OnTriggerEnter, cuando other tenga la etiqueta Player, cuenta la vuelta y llama a onLap.Invoke con las vueltas completadas.
  3. Cuando lleguen a laps, llama a onRaceOver.Invoke(); después, cruzar no hará nada.

Pulsa «Jugar» y conduce tres vueltas. Después, pulsa «Comprobar».

Pruébalo tú mismo

using UnityEngine;

public class FinishLine : MonoBehaviour
{
    public int laps = 3;

    void OnTriggerEnter(Collider other)
    {
        // el coche cruzó la línea: una vuelta más completada
    }
}

Todas las lecciones de Arquitectura de juegos en Unity

Practica por tu cuenta: Playground de Unity