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.
Desafío
FácilAsigna a FinishLine los eventos a los que están conectadas las filas de la escena.
- Añade
using UnityEngine.Events;,public UnityEvent<int> onLap;,public UnityEvent onRaceOver;y un int privado para las vueltas completadas. - En
OnTriggerEnter, cuandoothertenga la etiquetaPlayer, cuenta la vuelta y llama aonLap.Invokecon las vueltas completadas. - Cuando lleguen a
laps, llama aonRaceOver.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
1Componentes, no jerarquías
Componentes pequeñosUn script base para enemigosComponentes abstractosComponentes que trabajan juntosRepaso: torreta modularRepaso: cañón doble4Datos serializados
Clases serializablesListas en el InspectorEnumeraciones en el InspectorRepaso: tabla de botínRepaso: sortear el botín2Interfaces en Unity
IDamageableInterfaces y TryGetComponentGetComponentsRepaso: Tecla de interacciónRepaso: El más cercano al alcance5ScriptableObjects
Activos de datosEstadísticas de armasConfiguración compartidaGuardar el vientoOleadas como datosRepaso: base de datos de objetosRepaso: comprar en la tienda3Eventos
Eventos de C# en UnitySuscribirse en OnEnableCampos UnityEventLos eventos controlan la interfazRepaso: ventana emergente de logrosRepaso: temporizador de la ventana emergentePractica por tu cuenta: Playground de Unity