En aquest tema, explorarem les coroutines i la programació asíncrona en Unity. Les coroutines són una característica poderosa de Unity que permet executar codi durant múltiples fotogrames sense bloquejar el fil principal. Això és especialment útil per a tasques que requereixen temps, com ara animacions, esperes o càrregues de recursos.

Què és una Coroutine?

Una coroutine és una funció que pot pausar la seva execució i reprendre-la més tard. Això permet que altres funcions continuïn executant-se mentre la coroutine està en pausa. En Unity, les coroutines es defineixen utilitzant el tipus de retorn IEnumerator.

Exemple Bàsic de Coroutine

using UnityEngine;
using System.Collections;

public class CoroutineExample : MonoBehaviour
{
    void Start()
    {
        // Inicia la coroutine
        StartCoroutine(ExampleCoroutine());
    }

    IEnumerator ExampleCoroutine()
    {
        // Imprimeix un missatge
        Debug.Log("Coroutine iniciada");

        // Pausa la coroutine durant 2 segons
        yield return new WaitForSeconds(2);

        // Imprimeix un altre missatge després de la pausa
        Debug.Log("Coroutine reprès després de 2 segons");
    }
}

Explicació del Codi

  1. Definició de la Coroutine: La funció ExampleCoroutine està definida amb el tipus de retorn IEnumerator.
  2. Inici de la Coroutine: La coroutine s'inicia amb StartCoroutine(ExampleCoroutine()) dins del mètode Start.
  3. Pausa de la Coroutine: La línia yield return new WaitForSeconds(2) pausa l'execució de la coroutine durant 2 segons.
  4. Resum de la Coroutine: Després de la pausa, la coroutine reprèn l'execució i imprimeix un altre missatge.

Avantatges de les Coroutines

  • No Bloquegen el Fil Principal: Les coroutines permeten executar tasques llargues sense bloquejar el fil principal, mantenint la fluïdesa del joc.
  • Simplicitat: Són fàcils d'implementar i llegir, especialment per a tasques seqüencials.

Programació Asíncrona

La programació asíncrona permet executar operacions de manera no bloquejant, millorant el rendiment i la resposta de l'aplicació. En Unity, les coroutines són una forma de programació asíncrona, però també es poden utilitzar altres tècniques com les tasques (Tasks) de C#.

Exemple de Tasca Asíncrona

using UnityEngine;
using System.Threading.Tasks;

public class AsyncExample : MonoBehaviour
{
    async void Start()
    {
        // Inicia la tasca asíncrona
        await ExampleAsync();
    }

    async Task ExampleAsync()
    {
        // Imprimeix un missatge
        Debug.Log("Tasques asíncrones iniciades");

        // Pausa la tasca durant 2 segons
        await Task.Delay(2000);

        // Imprimeix un altre missatge després de la pausa
        Debug.Log("Tasques asíncrones reprès després de 2 segons");
    }
}

Explicació del Codi

  1. Definició de la Tasca Asíncrona: La funció ExampleAsync està definida amb el tipus de retorn Task i el modificador async.
  2. Inici de la Tasca Asíncrona: La tasca s'inicia amb await ExampleAsync() dins del mètode Start.
  3. Pausa de la Tasca: La línia await Task.Delay(2000) pausa l'execució de la tasca durant 2 segons.
  4. Resum de la Tasca: Després de la pausa, la tasca reprèn l'execució i imprimeix un altre missatge.

Exercicis Pràctics

Exercici 1: Coroutine amb Animació

Crea una coroutine que mogui un objecte des de la seva posició actual fins a una nova posició en 3 segons.

Solució

using UnityEngine;
using System.Collections;

public class MoveObject : MonoBehaviour
{
    public Vector3 targetPosition;

    void Start()
    {
        StartCoroutine(MoveToPosition(targetPosition, 3f));
    }

    IEnumerator MoveToPosition(Vector3 target, float duration)
    {
        Vector3 startPosition = transform.position;
        float elapsedTime = 0;

        while (elapsedTime < duration)
        {
            transform.position = Vector3.Lerp(startPosition, target, elapsedTime / duration);
            elapsedTime += Time.deltaTime;
            yield return null;
        }

        transform.position = target;
    }
}

Exercici 2: Tasca Asíncrona amb Càrrega de Recursos

Crea una tasca asíncrona que carregui una textura des d'una URL i l'apliqui a un material.

Solució

using UnityEngine;
using System.Threading.Tasks;
using UnityEngine.Networking;

public class LoadTexture : MonoBehaviour
{
    public string url = "https://example.com/texture.png";
    public Renderer targetRenderer;

    async void Start()
    {
        Texture2D texture = await LoadTextureFromURL(url);
        targetRenderer.material.mainTexture = texture;
    }

    async Task<Texture2D> LoadTextureFromURL(string url)
    {
        using (UnityWebRequest request = UnityWebRequestTexture.GetTexture(url))
        {
            await request.SendWebRequest();

            if (request.result == UnityWebRequest.Result.Success)
            {
                return DownloadHandlerTexture.GetContent(request);
            }
            else
            {
                Debug.LogError("Error carregant la textura: " + request.error);
                return null;
            }
        }
    }
}

Resum

En aquesta secció, hem après sobre les coroutines i la programació asíncrona en Unity. Les coroutines permeten executar codi durant múltiples fotogrames sense bloquejar el fil principal, mentre que les tasques asíncrones de C# ofereixen una altra manera de gestionar operacions no bloquejants. Ambdós mètodes són útils per a millorar el rendiment i la resposta de les aplicacions en Unity.

Curs de Unity

Mòdul 1: Introducció a Unity

Mòdul 2: Programació Bàsica en Unity

Mòdul 3: Treballant amb Actius

Mòdul 4: Física i Col·lisions

Mòdul 5: Interfície d'Usuari (UI)

Mòdul 6: Àudio en Unity

Mòdul 7: Programació Avançada

Mòdul 8: Física Avançada i IA

Mòdul 9: Optimització i Rendiment

Mòdul 10: Publicació i Més Enllà

© Copyright 2024. Tots els drets reservats