Campos de UnityEvent
Parte de la sección Arquitectura de juegos en Unity del Journey de Unity de Coddy. Lección 12 de 50.
El evento 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 regresiva 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 () tiene 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 bajo Dynamic int, y esa fila recibe el valor que se pasa a Invoke, en este caso, los segundos restantes. El mismo método bajo Static Parameters recibe en su lugar 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 agregar listeners 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 hace fallar la compilación en lugar de dejar una fila silenciosa <Missing>, y un evento de C# nunca aparece en el Inspector.
Desafío
FácilUna carrera de tres vueltas alrededor de la isla. Las flechas conducen el coche (Car.cs), y la escena está configurada como lo haría un diseñador en el Inspector: la lista On Lap (Int32) de FinishLine llama a LapBoard.ShowLaps (Dynamic int) en LapText y a Crowd.Cheer en Crowd, y la lista On Race Over () llama a LapBoard.ShowFinished y a Car.Stop. Esos scripts están listos, pero no hay nada que asignar a las filas hasta que FinishLine tenga los eventos.
Escribe FinishLine.cs:
- Dos campos UnityEvent:
onLap, que pasa un int, yonRaceOver, que no pasa nada. - Cada vez que el coche (etiquetado
Player) cruce la línea, se completa una vuelta: invocaonLapcon el número de vueltas completadas (1, después 2 y después 3). No cuenta nada más que cruce la línea. - Cuando las vueltas completadas lleguen a
laps(3), invocaonRaceOver. Después de eso, cruzar la línea no hace nada.
Pulsa Play, conduce tres vueltas alrededor de la isla y luego pulsa Check.
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
}
}
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
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 modular4Datos serializados
Clases serializablesListas en el InspectorEnumeraciones en el InspectorRepaso: tabla de botín7Máquinas de estados
Estados como clasesUna máquina de estadosTransicionesCerebros de enemigosRepaso: estados de puertas10Proyecto: Superviviente de la arena
El héroeTipos de enemigos2Interfaces en Unity
IDamageableInterfaces y TryGetComponentGetComponentsRepaso: tecla de interacción5ScriptableObjects
Recursos de datosEstadísticas de armasConfiguración compartidaOleadas como datosRepaso: base de datos de objetos