[Conceptos básicos de C#] ¿Qué es un evento? ¿Cuáles son los escenarios de aplicación en el juego?

concepto

C#En , los eventos eventse utilizan para implementar un mecanismo de devolución de llamada basado en delegados.

Los eventos permiten que los objetos notifiquen a otros objetos que se han producido operaciones específicas y, opcionalmente, estos objetos pueden responder a esas operaciones.

Los eventos se utilizan a menudo para implementar un modelo de publicación-suscripción donde un objeto ( el publicador ) emite un evento y otros objetos ( suscriptores ) escuchan el evento y realizan sus acciones cuando ocurre el evento.

Escenario de aplicación:

Supongamos un escenario, ahora hay una actualización de personaje como se muestra en la figura a continuación, y la actualización debe ser suficiente exp:

  • Si 获得的exp< 升级所需的exp, el editor indica que la experiencia no es suficiente, entonces el suscriptor la ignora;
  • si 获得的exp≥ \ge升级所需的exp , entonces los suscriptores tendránlos efectos de pantalla de actualización.

    Además del ejemplo de subir de nivel, también hay aplicaciones como árboles de habilidades, uso de elementos, etc.

Ventajas del evento

  • El desacoplamiento de editores y suscriptores para que no necesiten conocer la implementación del otro hace que el sistema sea más flexible y más fácil de mantener y ampliar.
  • Los eventos también proporcionan una forma uniforme de ampliar la funcionalidad de las clases.

Al ver las ventajas anteriores, es posible que Xiaobai no sepa de qué está hablando, no se preocupe, sigamos mirando hacia abajo.

Cómo crear un evento

C#En , los eventos se componen de palabras clave de delegado y evento. Entonces un proceso básico es el siguiente:

  1. Al declarar un evento, primero debe declarar un tipo de delegado y luego usar eventla palabra clave para declarar el tipo de delegado como un evento.
  2. Los suscriptores pueden agregar sus métodos a la lista de delegados del evento usando +=el operador que se llamará cuando ocurra el evento.
  3. Los publicadores pueden desencadenar eventos invocando la lista de delegados del evento.

A continuación, se muestran CodeMonkeyejemplos de eventos de C# conocidos:

Paso 1: Cree scripts de C# para que los editores y los suscriptores AddComponentcompartan lo mismoGameObject

Paso 2: Definir un editor

Defina tres eventos.

  • OnSpacePressedEvento, que es un tipo de delegado con un OnSpacePressedArgsparámetro EventHandlerque representa un evento que ocurre cuando se presiona la barra espaciadora.
  • OnFloatEventEvento, el evento es un TestEventDelegatetipo de delegado, lo que significa un evento que se puede desencadenar en cualquier momento.
  • OnActionEventEvento, el evento es un Actiontipo de delegado con parámetros booly int, lo que indica que el evento se puede desencadenar en cualquier momento.

Método de actualización

Si detecta que se presiona la barra espaciadora, se disparará el evento OnSpacePressed、OnFloatEvent和OnActionEvent.
En OnSpacePressedel evento ( incluido el contenido del comentario ), use EventArgs.Emptyel parámetro pasar vacío para indicar que este evento no requiere ningún parámetro, pero también podemos usar parámetros personalizados OnSpacePressedArgs.

En OnFloatEventeventos y OnActionEventeventos, use Invokemétodos para desencadenar eventos y pase los parámetros necesarios a los métodos de manejo de eventos.
TestingEvents.cs

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;

public class TestingEvents : MonoBehaviour
{
    
    
	// 声明一个事件
    public event EventHandler<OnSpacePressedArgs> OnSpacePressed;
    public class OnSpacePressedArgs : EventArgs
    {
    
    
        public int spaceCount;
    }
    private int spaceCount;
    public event TestEventDelegate OnFloatEvent;
    //定义一个委托类型
    public delegate void TestEventDelegate(float f);
    public event Action<bool, int> OnActionEvent;
    //统一的安全API,方便定义委托类型
    public UnityEvent OnUnityEvent;
    // Start is called before the first frame update
    void Start(){
    
    }
    // Update is called once per frame
    // 在触发事件
    void Update()
    {
    
    
        if (Input.GetKeyDown(KeyCode.Space))
        {
    
    
            spaceCount++;
            //Space pressed!
            //if(OnSpacePressed!= null) OnSpacePressed(this,EventArgs.Empty);
            OnSpacePressed?.Invoke(this, new OnSpacePressedArgs {
    
     spaceCount = spaceCount});

            OnFloatEvent?.Invoke(5.5f);

            OnActionEvent?.Invoke(true,56);

            OnUnityEvent?.Invoke();
        }
    }
}

Paso 3: Implementar los suscriptores correspondientes

método de inicio

Suscríbase a los tres eventos mencionados y, en Startel método, obtenga TestingEventsel componente y TestingEventSubscriberasocie sus eventos con los métodos de la clase para que se ejecuten cuando se dispare el evento. Los eventos suscritos aquí son respectivamente OnSpacePressed、OnFloatEvent和OnActionEvent.

Definir métodos para manejar estos tres eventos.

Cuando se dispara un evento, estos TestingEvents_OnSpacePressed、TestingEvents_OnFloatEvent和TestingEvents_OnActionEventmétodos se invocarán con los parámetros esperados por su evento correspondiente.
Cada método tiene un comportamiento específico, por ejemplo, dentro de TestingEvents_OnSpacePressedun método, se genera un mensaje de depuración con el número de pulsaciones de la barra espaciadora.

metodo publico

TestingEventSubscriberLa clase también define un TestingUnityEventmétodo público llamado , que simplemente genera un mensaje de depuración para demostrar cómo usar el método como controlador de eventos.
TestingEventSubscriber.cs

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TestingEventSubscriber : MonoBehaviour
{
    
    
    // Start is called before the first frame update
    void Start()
    {
    
    
        //作为获得订阅的行为
        TestingEvents testingEvents =GetComponent<TestingEvents>();
        testingEvents.OnSpacePressed += TestingEvents_OnSpacePressed;
        testingEvents.OnFloatEvent += TestingEvents_OnFloatEvent;
        testingEvents.OnActionEvent += TestingEvents_OnActionEvent;

    }

    public void TestingUnityEvent()
    {
    
    
        Debug.Log("TestingUnityEvent");
    }

    private void TestingEvents_OnActionEvent(bool arg1,int arg2) 
    {
    
    
        Debug.Log(arg1 + " " + arg2);
    }

    private void TestingEvents_OnFloatEvent(float f)
    {
    
    
        Debug.Log("Float:" +f );
    }

    private void TestingEvents_OnSpacePressed(object sender, TestingEvents.OnSpacePressedArgs e)
    {
    
    
        Debug.Log("Space!"+e.spaceCount);
        //取消订阅
        //TestingEvents testingEvents = GetComponent<TestingEvents>();
        //testingEvents.OnSpacePressed -= TestingEvents_OnSpacePressed;
    }

    // Update is called once per frame
    void Update(){
    
    }
}

Ignorado por no novatos: la barra para mirar unityal depurarconsole

Nota: ¿Cómo usar métodos públicos?

Encuentre el suyo primero GameObject
inserte la descripción de la imagen aquí
, luego elija su método público
inserte la descripción de la imagen aquí

Volver a dudas anteriores

El llamado desacoplamiento, ¿puede observar por qué el editor no usa el método de inicio? En su lugar, utilice el método updata
porque no queremos escribir la implementación del suscriptor en la clase del editor.

El método público es en realidad una API, solo úselo.

Por supuesto, no respondas así la pregunta del entrevistador, la gente te despreciará cuando vea que tu respuesta es tan simple.

socio cooperativo

Potente manual solo puede chatGpt3.5

referencia

Video de C# Basic de CodeMonkey, analizado por un 2$/monthhumilde estudiante.

Supongo que te gusta

Origin blog.csdn.net/kokool/article/details/129772271
Recomendado
Clasificación