c# - unet - unity juego red
Sistema de eventos simple en Unity (2)
Debes usar
UnityEvent
.
public UnityEvent whoa;
No podría ser más fácil. Hacer un script BigScript.cs
using UnityEngine;
using System.Collections;
using UnityEngine.Events;
public class BigScript:MonoBehaviour
{
[Header("Here''s a cool event! Drag anything here!")]
public UnityEvent whoa;
}
Ponlo en un objeto del juego. Ahora míralo en el Inspector . ¿Guay, verdad?
Simplemente arrastre sus otras secuencias de comandos hasta allí, para que algo suceda, en esas otras secuencias de comandos, cuando ocurra "whoa".
Es así de simple. Para llamar al evento en BigScript, es solo
public class BigScript:MonoBehaviour
{
[Header("Here''s a cool event! Drag anything here!")]
public UnityEvent whoa;
private void YourFunction()
{
whoa.Invoke();
}
(si lo prefiere,
if (whoa!=null) whoa.Invoke();
)
En casos excepcionales, es posible que deba agregar un oyente a través del código.
(Quiero decir, en lugar de simplemente arrastrarlo al Editor).
Hoy en día esto es simple. Tenga en cuenta el código de ejemplo desactualizado en Internet.
whoa.AddListener(ScreenMaybeChanged);
Para ser claros: nunca haga eso , simplemente arrastre para conectarse. Solo lo menciono por completo.
Eso es todo al respecto.
Tenga en cuenta el código de ejemplo desactualizado con respecto a este tema en Internet. *
Lo anterior muestra cómo conectar funciones simples que no tienen argumento .
Si necesitas un argumento:
Un ejemplo donde la función tiene un argumento ONE FLOAT:
Simplemente agregue ESTE CÓDIGO en la parte superior del archivo:
[System.Serializable] public class _UnityEventFloat:UnityEvent<float> {}
entonces ya está todo listo.
...
using UnityEngine.Events;
// magic line of code...
[System.Serializable] public class _UnityEventFloat:UnityEvent<float> {}
public class SomeThingHappens : MonoBehaviour
{
public _UnityEventFloat changedLength;
public _UnityEventFloat changedHeight;
... and then ...
void ProcessValues(float v)
{
....
if (changedLength != null) changedLength.Invoke(1.4455f);
}
}
Cuando arrastre desde su otra función a la ranura del Editor en esta función:
Asegúrese de utilizar los que están arriba: "Flotación dinámica".
¡Confusamente, sus funciones TAMBIÉN aparecerán en la sección inferior "Parámetros estáticos"!
¡Esa es una gran gotchya en Unity!
Estoy tratando de usar el sistema de eventos en Unity (la forma C #), pero tengo problemas para implementarlo.
La mayoría de los ejemplos muestran una clase, donde define el controlador; luego escribe en la misma clase, la función que coincide con la firma del controlador, y escribe los eventos como estáticos
public class EventExample : MonoBehaviour
{
public delegate void ExampleEventHandler();
public static event ExampleEventHandler OneDayPassed;
public static void NextTurn()
{
// do stuff then send event
if (OneDayPassed != null)
OneDayPassed();
}
}
Luego, en otra clase, te suscribes a los eventos, creando una función que realmente hace algo
public class EntityWatcher: MonoBehaviour
{
void Start()
{
EventExample.OneDayPassed += this.PrepareNextDay;
}
public void PrepareNextDay()
{
// Do other stuff that happen after the day is done
}
}
Hasta ahora no hay problemas, pero no estoy seguro de cómo diseñarlo, por lo que cualquier GameObject de un tipo en particular se suscribirá a este evento. Por ejemplo, si tiene una categoría de personal de GO, que funciona de 8 a 6, y los instancia en tiempo de ejecución; ¿Debería suscribirme en la clase principal de esta categoría, o debería crear un script que adjunte al prefabricado de objetos de juego, que se suscriba al evento?
El objetivo es que todos los miembros del personal que deben hacer un turno de 8 a 6 en el centro deportivo, sepan cuándo se inicia el evento "día terminado", pero no quiero suscribirme a cada prefabricación que instancia.
Según tengo entendido, debería adjuntar un script con el código necesario en el prefabricado, pero no puedo encontrar un ejemplo práctico que muestre si esa es realmente la forma de hacerlo.
No se preocupe demasiado por la cantidad de suscriptores si solo está hablando de unas pocas docenas. Sí, una vez que llegue a los cientos o miles, podría ser una buena idea optimizar esto, pero incluso así. Primera regla de optimización: no optimizar.
Entonces: solo haga que cada instancia se suscriba al evento y termine con él.