Coroutines são funções que podem ser executadas de forma concorrente com o ciclo principal de execução do jogo...
A versão em vídeo deste tutorial não está disponível atualmente neste idioma.
Transcrição do vídeo
Olá a todos!
Bem-vindos a este tutorial básico sobre o uso de Coroutines no Unity.
Coroutines são funções que podem ser executadas de forma concorrente com o ciclo principal de execução do jogo.
Neste tutorial, vou usar um exemplo prático para explicar o conceito e também apresentar a função WaitForSeconds, que permite aguardar a execução de uma operação por um número específico de segundos.
Este tutorial pressupõe que você tenha um conhecimento básico de programação em C# no Unity. Ele foi gravado usando a versão 2022 do Unity, mas Coroutines estão disponíveis em muitas linguagens de programação e em versões anteriores do Unity.
Nosso objetivo é fazer com que o canhão dispare automaticamente um Prefab de bala de canhão, que é uma esfera preta simples, a cada 3 segundos, até que ocorra um evento externo que interrompa essa rotina.

Neste caso, o evento externo será o usuário pressionando a tecla S, de "Stop".
Para começar, precisamos criar um script para o canhão e chamá-lo de "autoshoot".
Dentro da classe principal, defino três variáveis para especificar o ponto inicial da bala em relação ao canhão:
public GameObject spawnPrefab;
Vou vincular o prefab da bala de canhão no Unity Editor a esta variável pública.
Vector3 spawnPosition;
Quaternion spawnRotation;
Calculei esse ponto e a orientação inicial, então inicializo esses dois valores dentro da função Start:
spawnPosition = transform.position + new Vector3(-1.2f, 1.8f, 0f);
spawnRotation = Quaternion.Euler(-10f, -90f, 0f);


É claro que precisamos implementar um loop que se repita indefinidamente, a menos que um evento externo o interrompa, e que inclua uma instrução de espera de 3 segundos antes de passar para a próxima iteração.
OBSERVAÇÃO: o prefab da bala de canhão vem com um script que, ao iniciar, aplica um impulso inicial para frente na bala e define o objeto para se autodestruir após 3 segundos, para não encher nem o universo virtual nem a memória do sistema com balas de canhão.
A instrução WaitForSeconds nos permite pausar por uma quantidade específica de tempo, que no nosso caso é de 3 segundos.
Agora precisamos criar um bloco WHILE para executar o loop principal, que estou escrevendo neste momento em um espaço vazio do script.
while(true) {
GameObject cannonBall = Instantiate(spawnPrefab, spawnPosition, spawnRotation, null);
yield return new WaitForSeconds(3);
}
Então, onde devemos colocar esse bloco WHILE?
Ele não pode ser colocado em Start, pois não podemos usar yield WaitForSeconds ali. Além disso, colocá-lo em Update não geraria atraso, já que Update é chamado a cada frame do jogo.
Portanto, devemos criar uma função chamada "shoot" que retorne o tipo IEnumerator e inclua o bloco WHILE.
Essa função permitirá iniciar uma Coroutine usando a instrução StartCoroutine com o nome da função como parâmetro entre aspas duplas.
Como o canhão precisa começar a atirar imediatamente, escrevemos:
StartCoroutine("shoot");
dentro de Start, imediatamente após inicializar spawnPosition e spawnRotation.
Vamos salvar o script e ir para o editor testar o script definido até este ponto.
Para poder parar ou reiniciar a Coroutine, vamos voltar ao script e adicionar duas instruções.

Podemos parar a Coroutine verificando se a tecla S foi pressionada e então chamando a função StopCoroutine com a Coroutine "shoot" como parâmetro.
Da mesma forma, podemos reiniciar a Coroutine verificando se a tecla R foi pressionada e chamando a função StartCoroutine com "shoot" como parâmetro.
Então, vamos escrever, dentro de Update:
if(Input.GetKeyDown(KeyCode.S)) StopCoroutine("shoot");
if(Input.GetKeyDown(KeyCode.R)) StartCoroutine("shoot");

Depois de adicionar essas instruções, vamos salvar o script e voltar ao Unity Editor para testá-lo.
Isso é tudo para este breve tutorial. Espero que tenha sido útil para você! Até breve!