Desarrollo de Unity: cómo hacer devoluciones de llamada en rutinas

En el desarrollo de Unity, coroutine es un método práctico de programación asincrónica. Para realizar una devolución de llamada en coroutine, puede usar delegado (delegado), Acción o UnityAction


1. Delegado

Aquí hay un ejemplo simple usando corrutinas y devoluciones de llamada:

    // 声明一个委托类型的回调
    public delegate void CoroutineCallback();

    // 在开始时调用
    void Start()
    {
    
    
        StartCoroutine(WaitAndExecute(3f, () =>
        {
    
    
            Debug.Log("延时3秒后执行回调");
        }));
    }

    // 协程方法
    private IEnumerator WaitAndExecute(float delay, CoroutineCallback callback)
    {
    
    
        // 等待指定的时间
        yield return new WaitForSeconds(delay);
        // 执行回调函数
        callback?.Invoke();
    }

En este ejemplo, se crea un método coroutine denominado WaitAndExecute, que acepta un retraso de parámetro de tipo float y una función de devolución de llamada de tipo delegado denominada CoroutineCallback. En el método coroutine, el yield return new WaitForSeconds(delay) se usa para suspender la ejecución durante el tiempo especificado y luego llamar a la función de devolución de llamada.

En el método de inicio, iniciamos la rutina y pasamos un método anónimo como función de devolución de llamada. Cuando la corrutina termine de esperar, se ejecutará la función de devolución de llamada y se imprimirá un mensaje.


Para ilustrar el uso de la función de devolución de llamada más específicamente, el siguiente ejemplo demuestra cómo usar la función de devolución de llamada CoroutineCallback mencionada anteriormente en Unity

Supongamos que tenemos una tarea en el juego que requiere que el jugador espere 5 segundos antes de mostrar una notificación de que la tarea está completa.

using System.Collections;
using UnityEngine;

public class TaskExample : MonoBehaviour
{
    
    
    // 声明一个委托类型的回调
    public delegate void CoroutineCallback();

    // 在开始时调用
    private void Start()
    {
    
    
        // 启动协程,等待5秒钟后执行任务完成的回调函数
        StartCoroutine(WaitAndExecute(5f, TaskCompleted));
    }

    // 协程方法
    private IEnumerator WaitAndExecute(float delay, CoroutineCallback callback)
    {
    
    
        // 等待指定的时间
        yield return new WaitForSeconds(delay);
        // 执行回调函数
        callback?.Invoke();
    }

    // 任务完成的回调函数
    private void TaskCompleted()
    {
    
    
        Debug.Log("任务已完成!");
        // 在这里执行其他任务完成后的操作
    }
}

En este ejemplo, se crea una clase denominada TaskExample, que contiene un método coroutine WaitAndExecute, que se utiliza para esperar el tiempo especificado (determinado por el parámetro de retraso) y luego ejecutar la función de devolución de llamada del tipo CoroutineCallback.

La corrutina WaitAndExecute se inicia en el método Start y se pasan un tiempo de espera de 5 segundos y una función de devolución de llamada denominada TaskCompleted. Cuando la rutina espere 5 segundos, ejecutará la función de devolución de llamada TaskCompleted. Esta función de devolución de llamada imprime un mensaje de que la tarea está completa. Puede agregar otras funciones según sea necesario en esta función de devolución de llamada.


Dos, Acción o UnidadAcción

Action es en realidad un tipo de delegado integrado de C# y UnityAction es un tipo de delegado específico en el motor de Unity. También usamos el ejemplo mencionado anteriormente para ilustrar

using System;
using System.Collections;
using UnityEngine;

public class TaskExampleWithAction : MonoBehaviour
{
    
    
    // 在开始时调用
    private void Start()
    {
    
    
        // 启动协程,等待5秒钟后执行任务完成的回调函数
        StartCoroutine(WaitAndExecute(5f, TaskCompleted));
    }
    // 协程方法
    private IEnumerator WaitAndExecute(float delay, Action callback)
    {
    
    
        // 等待指定的时间
        yield return new WaitForSeconds(delay);
        // 执行回调函数
        callback?.Invoke();
    }
    // 任务完成的回调函数
    private void TaskCompleted()
    {
    
    
        Debug.Log("任务已完成!");
        //在这里执行其他任务完成后的操作
    }
}

En este ejemplo, deje CoroutineCallback委托类型替换为Action类型,也可以替换成UnityAction类型el código anterior sin cambios.

Usando la función de devolución de llamada de acción para lograr la misma funcionalidad que el ejemplo anterior, puede modificar este ejemplo para usar rutinas y devoluciones de llamada de acción en sus propios proyectos.


Las funciones de devolución de llamada anteriores no regresan con parámetros, y lo siguiente es sobre 带参数el uso de la función de devolución de llamada, que también se usa por ciertoUnityAcciónPor ejemplo

using System;
using System.Collections;
using UnityEngine;

public class TaskExampleWithUnityAction : MonoBehaviour
{
    
    
    private void Start()
    {
    
    
        StartCoroutine(WaitAndExecute(3f, (int count) =>
        {
    
    
            Debug.Log($"延时3秒后执行回调,参数值:{
      
      count}");
        }));
    }
    // 协程方法
    private IEnumerator WaitAndExecute(float delay, UnityAction<int> callback)
    {
    
    
        // 等待指定的时间
        yield return new WaitForSeconds(delay);
        // 执行回调函数,并传递一个整数参数
        callback?.Invoke(10);
    }
}

En este ejemplo, el método coroutine WaitAndExecute se modifica y el tipo Action se reemplaza por el tipo Action<int>, lo que indica que la función de devolución de llamada acepta un parámetro entero. En el método coroutine, se pasa un valor entero al llamar a la función de devolución de llamada

Puede usar diferentes tipos de parámetros (como Action<string>, Action<float>, etc.) o varios parámetros (como Action<int, string, bool>) para satisfacer sus necesidades., simplemente sepárelos con comas, por ejemplo:

using System;
using System.Collections;
using UnityEngine;

public class TaskExampleWithUnityAction : MonoBehaviour
{
    
    
    private void Start()
    {
    
    
        //Lambda表达式
        //StartCoroutine(WaitAndExecute(3f, (int count,string message) =>
        //{
    
    
        //    Debug.Log($"延时3秒后执行回调,参数值:{count},{message}");
        //}));
        //或者
        StartCoroutine(WaitAndExecute(3f,TaskCompleted));
    }
    // 协程方法
    private IEnumerator WaitAndExecute(float delay, UnityAction<int,string> callback)
    {
    
    
        // 等待指定的时间
        yield return new WaitForSeconds(delay);
        // 执行回调函数,并传递一个整数和字符串
        callback?.Invoke(8,"Hello");
    }
    // 任务完成的回调函数
    private void TaskCompleted(int count,string message)
    {
    
    
        Debug.Log($"延时3秒后执行回调,参数值:{
      
      count},{
      
      message}");
    }
}

Lo anterior es el uso de la función de devolución de llamada en la rutina. Si no está claro, puede dejar un mensaje en el área de comentarios.

Supongo que te gusta

Origin blog.csdn.net/qq_33795300/article/details/130542585
Recomendado
Clasificación