A função StartCoroutine em Unity permite a execução de código assíncrono de forma controlada dentro do ciclo de vida de um MonoBehaviour. Corrotinas são ideais para tarefas que precisam ser executadas ao longo de vários frames, sem impactar o desempenho da aplicação.
A execução de uma corrotina é pausada em pontos definidos por instruções yield. O valor retornado por yield determina quando a execução da corortina será retomada. É importante notar que StartCoroutine retorna imediatamente, mas o yield pode introduzir atrasos na conclusão da corrotina.
Enquanto em linguagens como JavaScript as corrotinas são gerenciadas pelo compilador, em C# é necessário chamar explicitamente StartCoroutine.
Exemplo 1: Chamada Básica de Corrotina
Este exemplo demonstra como iniciar uma corrotina e observar sua execução sequencial sem esperar sua conclusão.
using UnityEngine;
using System.Collections;
public class ExemploCorrotinaBasica : MonoBehaviour
{
void Start()
{
// Imprime "Iniciando 0.0" e "Antes da Conclusão 0.0" imediatamente.
// Após 2 segundos, a mensagem da corrotina será impressa.
Debug.Log("Iniciando " + Time.time);
// Inicia a corrotina WaitAndPrint. Ela roda em paralelo com o método Start.
StartCoroutine(WaitAndPrint(2.0F));
Debug.Log("Antes da Conclusão " + Time.time);
}
IEnumerator WaitAndPrint(float tempoEspera)
{
// Pausa a execução da corrotina pelo tempo especificado.
yield return new WaitForSeconds(tempoEspera);
Debug.Log("Executado após espera " + Time.time);
}
}
Saída esperada:
- Após 0 segundos: "Iniciando 0.0"
- Após 0 segundos: "Antes da Conclusão 0.0"
- Após 2 segundos: "Executado após espera 2.0"
Exemplo 2: Aguardando a Conclusão de uma Corrrotina
Este exemplo mostra como iniciar uma corrotina e aguardar sua execução completa antes de prosseguir.
using UnityEngine;
using System.Collections;
public class ExemploAguardarCorrotina : MonoBehaviour
{
IEnumerator Start()
{
// Imprime "Iniciando 0.0" imediatamente.
// Após 2 segundos, imprime "Executado após espera 2.0" e "Finalizado 2.0".
Debug.Log("Iniciando " + Time.time);
// Executa a corrotina WaitAndPrint e aguarda até que ela termine.
yield return StartCoroutine(WaitAndPrint(2.0F));
Debug.Log("Finalizado " + Time.time);
}
IEnumerator WaitAndPrint(float tempoEspera)
{
// Aguarda o tempo especificado.
yield return new WaitForSeconds(tempoEspera);
Debug.Log("Executado após espera " + Time.time);
}
}
Saída esperada:
- Após 0 segundos: "Iniciando 0.0"
- Após 2 segundos: "Executado após espera 2.0"
- Após 2 segundos: "Finalizado 2.0"
Variante com Nome de Método (String)
Uma variação de StartCoroutine permite iniciar uma corrotina usando seu nome como uma string. Esta abordagem é útil quando se deseja parar a corrotina posteriormente usando StopCoroutine. No entanto, ela apresenta um custo de desempenho maior e só permite a passagem de um único parâmetro.
Exemplo 3: Parando uma Corrotina por Nome
Este exemplo demonstra como iniciar uma corrotina por nome e como pará-la explicitamente.
using UnityEngine;
using System.Collections;
public class ExemploPararPorNome : MonoBehaviour
{
void Start()
{
// Inicia a corrotina "ProcessarAlgo" com o parâmetro 2.0F.
StartCoroutine("ProcessarAlgo", 2.0F);
// Espera 1 segundo e então para a corrotina.
Invoke("PararProcessamento", 1.0F);
}
void PararProcessamento()
{
StopCoroutine("ProcessarAlgo");
Debug.Log("Corrotina ProcessarAlgo parada.");
}
IEnumerator ProcessarAlgo(object parametro)
{
float valorParametro = (float)parametro;
Debug.Log("Iniciando ProcessarAlgo com parâmetro: " + valorParametro);
// Loop infinito que será interrompido por StopCoroutine.
while (true)
{
Debug.Log("Processando...");
// Aguarda até o próximo frame.
yield return null;
}
}
}