Contenido

Corrutinas y Async en Unity

¿Qué son las Corrutinas?

Las corrutinas en Unity son una forma de gestionar la ejecución de código de manera asíncrona, permitiendo pausas en su ejecución y reanudaciones posteriores. Son especialmente útiles para realizar tareas que requieren esperar un cierto tiempo o eventos, sin bloquear el hilo principal del juego.

Características de las Corrutinas

  • Facilidad de uso: Se declaran con el tipo IEnumerator y se controlan usando yield return.
  • Control del tiempo: Permiten pausar la ejecución por un tiempo específico utilizando yield return new WaitForSeconds(tiempo).
  • Simplicidad para tareas secuenciales: Son ideales para secuencias de acciones que necesitan ejecutarse con pausas.

Ejemplo de Corrutina

using UnityEngine;
using System.Collections;

public class Example : MonoBehaviour
{
    void Start()
    {
        StartCoroutine(MyCoroutine());
    }

    IEnumerator MyCoroutine()
    {
        Debug.Log("Inicio de la corrutina");
        yield return new WaitForSeconds(2);
        Debug.Log("Han pasado 2 segundos");
        yield return new WaitForSeconds(3);
        Debug.Log("Han pasado 3 segundos más");
    }
}

¿Qué es Async/Await?

La programación asíncrona con async y await es una característica más reciente en Unity (compatible desde Unity 2017.1 con C# 7.0 y superior). Permite escribir código asíncrono de manera más intuitiva y estructurada, similar a las corrutinas, pero con ventajas adicionales en términos de legibilidad y manejo de excepciones.

Características de Async/Await

  • Sintaxis moderna: Se utilizan palabras clave async y await para definir y gestionar métodos asíncronos.
  • Mejor manejo de excepciones: Las excepciones en métodos async pueden ser manejadas de manera similar a los métodos sincrónicos.
  • Mayor flexibilidad: Se integran mejor con APIs asincrónicas modernas y permiten el uso de Task para gestionar tareas concurrentes.

Ejemplo de Async/Await

using UnityEngine;
using System.Threading.Tasks;

public class Example : MonoBehaviour
{
    async void Start()
    {
        await MyAsyncMethod();
    }

    async Task MyAsyncMethod()
    {
        Debug.Log("Inicio del método async");
        await Task.Delay(2000); // Espera 2 segundos
        Debug.Log("Han pasado 2 segundos");
        await Task.Delay(3000); // Espera 3 segundos más
        Debug.Log("Han pasado 3 segundos más");
    }
}

Diferencias Clave entre Corrutinas y Async/Await

Sintaxis y Estilo de Programación:

  • Corrutinas: Usan IEnumerator y yield return.
  • Async/Await: Usan palabras clave async y await con Task.

Manejo de Excepciones:

  • Corrutinas: Más difícil de manejar excepciones directamente dentro de la corrutina.
  • Async/Await: Mejor soporte para manejo de excepciones utilizando try-catch.

Integración con APIs Modernas:

  • Corrutinas: Limitadas a lo que Unity ofrece y menos flexibles para integrar con APIs asincrónicas externas.
  • Async/Await: Más adecuadas para trabajar con APIs modernas que devuelven Task.

Legibilidad y Mantenimiento del Código:

  • Corrutinas: Pueden ser menos intuitivas para secuencias complejas de operaciones asíncronas.
  • Async/Await: Facilita la escritura de código más limpio y estructurado.
Conclusión
Ambas técnicas tienen sus usos y ventajas en Unity, y la elección entre corrutinas y async/await dependerá del caso específico y las necesidades del proyecto.
/img/ref.png
.