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!

Este site tem como único objetivo apresentar alguns dos meus trabalhos, sem qualquer finalidade promocional. Observe que, no momento, não estou procurando - nem responderei a - solicitações de trabalhos personalizados, consultorias ou qualquer outro tipo de colaboração profissional.


INFORMAÇÕES DE POLÍTICA DE PRIVACIDADE AVANÇADAS E USO DOS FICHEIROS DE COOKIES