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ó
ExampleCoroutineestà 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ó
ExampleAsyncestà definida amb el tipus de retornTaski 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
