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
- Definició de la Coroutine: La funció
ExampleCoroutine
està definida amb el tipus de retornIEnumerator
. - Inici de la Coroutine: La coroutine s'inicia amb
StartCoroutine(ExampleCoroutine())
dins del mètodeStart
. - Pausa de la Coroutine: La línia
yield return new WaitForSeconds(2)
pausa l'execució de la coroutine durant 2 segons. - 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
- Definició de la Tasca Asíncrona: La funció
ExampleAsync
està definida amb el tipus de retornTask
i el modificadorasync
. - Inici de la Tasca Asíncrona: La tasca s'inicia amb
await ExampleAsync()
dins del mètodeStart
. - Pausa de la Tasca: La línia
await Task.Delay(2000)
pausa l'execució de la tasca durant 2 segons. - 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
- Introducció a Unity i Instal·lació
- Visió General de la Interfície de Unity
- Creant el Teu Primer Projecte
- Objectes de Joc Bàsics i Components
Mòdul 2: Programació Bàsica en Unity
- Introducció a C# per a Unity
- Creant i Adjuntant Scripts
- Entenent MonoBehaviour
- Gestió Bàsica d'Entrades
Mòdul 3: Treballant amb Actius
- Important i Gestionant Actius
- Utilitzant la Botiga d'Actius
- Creant i Utilitzant Prefabs
- Animació Bàsica
Mòdul 4: Física i Col·lisions
- Introducció a la Física de Unity
- Rigidbody i Col·liders
- Detecció Bàsica de Col·lisions
- Utilitzant Materials de Física
Mòdul 5: Interfície d'Usuari (UI)
- Introducció a la UI de Unity
- Creant i Personalitzant Elements de UI
- Gestió d'Esdeveniments de UI
- Creant Menús i HUDs
Mòdul 6: Àudio en Unity
- Introducció a l'Àudio en Unity
- Important i Utilitzant Clips d'Àudio
- Programació Bàsica d'Àudio
- Àudio 3D i So Espacial
Mòdul 7: Programació Avançada
- Conceptes Avançats de C# per a Unity
- Coroutines i Programació Asíncrona
- Objectes Scriptables
- Editors Personalitzats i Gizmos
Mòdul 8: Física Avançada i IA
- Tècniques Avançades de Física
- Pathfinding i Navegació
- Programació Bàsica d'IA
- Màquines d'Estats i Arbres de Comportament
Mòdul 9: Optimització i Rendiment
- Tècniques de Perfilat i Optimització
- Gestió de Memòria
- Reduint Draw Calls
- Optimitzant Física i Col·lisions