En este momento estás viendo ¿Puedo tener solo evento sin delegado?

 – Unity

¿Puedo tener solo evento sin delegado? – Unity

¿Puedo tener solo evento sin delegado?

– UnityAssets3Free

bienvenido , por aqui Juan y en esta ocasion os traigo
esta unity pregunta

Tengo un jugador con el evento «disparar». Si el jugador dispara una bala, activo manualmente el evento. Un GameObject diferente tiene una secuencia de comandos en la que, si el oyente y el evento se activan, el oyente ejecuta un método específico. Soy nuevo en eventos. Realmente no necesito un delegado, solo un evento. Me estoy enseñando a mí mismo a programar en Internet, pero en todas partes es como usar un evento solo para delegados.

¿Puedo tener solo un evento sin delegado y, de ser así, cómo declarar un evento así?

4 respuestas 4

Un evento es un delegado con restricciones de seguridad.

  • Solo puede llamar a un evento desde la clase que lo contiene.
  • Solo se puede registrar/dar de baja un evento fuera de la clase (solo +=/-=)
  • No puede pasar un evento como un parámetro
  • Solo puede borrar un evento de la clase que lo contiene (eventName = null)

Fuera de tema: UnityEvent no es un evento real, es una clase que contiene una lista de delegados (Acción).

Cuando llama a un evento (o un delegado), siempre debe verificar la nulabilidad, ya que nunca sabe si la referencia apunta a un objeto. No necesita esto con UnityEvent ya que, como mencioné, no es un evento real y si la colección está vacía, no sucede nada.

public delegate void MyDel();
// The two following behaves the same
public MyDel myDel;
public Action myAction;

public event Action myEvent;

void Start()
     if(myAction != null) myAction(); 
     if(myEvent != null)  myEvent(); 
     if(myEvent != null)  myEvent.Invoke(); 

son las mismas cosas, pero elegir una u otra depende de lo que quieras hacer.

Considere lo siguiente en otra clase:

void Start()
    refToClass.myAction = MyMethod;
    refToClass.myEvent += MyMethod;

void MyMethod()

El primer caso eliminará todos los métodos adjuntos al delegado y MyMethod será el único que quedará para escuchar. El evento no permitirá esto, solo se permiten +=/-=, por lo que solo puede eliminar/agregar un método sin afectar a los demás.

Un delegado básicamente describe un tipo de rol. Un evento es un gancho donde las funciones registradas que corresponden a un determinado tipo de función se llaman cuando ocurre el evento.

Al juntar estas dos definiciones simplificadas, un delegado también es un descriptor de un evento, por lo que no puede tener un evento sin un delegado relacionado.

De cualquier manera, no es necesario que declare un nuevo delegado para cada evento que declare. En su lugar, puede utilizar cualquiera de los delegados preexistentes, como EventHandler, EventHandler<TEventArgs> o incluso cualquiera de Action sobrecargas, eligiendo la que mejor se adapte a cada caso.

Creo que técnicamente puedes tener eventos sin un delegado como se describe en respuestas aquí.

Sin embargo, los delegados se utilizan para pasar información sobre dónde se generó el evento. Sin él, el programa no sabe desde dónde se llamó el evento y qué información pasar.

Esto es un buena introducción y hay muchos ejemplos en SO para ayudar con casos de nicho. Por ahora, si estás aprendiendo a programar por tu cuenta, te recomiendo que aprendas el patrón y lo pongas en práctica antes de preocuparte de por qué el delegado y el evento siempre vienen a la par.

public delegate void ShootEventHandler(object sender, ShootEventArgs e);
public class ShootEventArgs

    public ShootEventArgs(string s)  Text = s; 
    public String Text get; private set; // readonly

Es común pasar this en el remitente y luego nuevo el delegado que creó. Donde quieras llamar al tiro, tendrías algo como esto.

var handler = this.Shoot; // Get the event you want to fire
handler?.Invoke(this, new ShootEventArgs("Bang")); // tell eveything interested "Bang"

Los GameObjects interesados ​​en el evento de tiro pueden suscribirse a la información de la siguiente manera:

this.Player.Shoot += this.ShootHandler;
public void ShootHandler(object sender, ShootEventArgs e) // common to use e for event args

    Console.WriteLine(e.Text); // print "Bang"

Sí, puede declarar un evento sin declarar un delegado mediante Acción. La acción está en el espacio de nombres del sistema. Así que asegúrese de agregar «usando el sistema;» declaración en la parte superior de su archivo de código.

//No parameter
delegate void _delegate1(); 
static event _delegate1 _event1;

//Parameterized
delegate void _delegate2(bool flag);
static event _delegate2 _event2;

esto es equivalente a

static event Action _event1;
static event Action<bool> _event2;

nota: si aun no se resuelve tu pregunta por favor dejar un comentario y pronto lo podremos de nuevo , muchas gracias

eso es todo,espero que te funcione

Deja una respuesta