quarta-feira, 12 de setembro de 2018

Coroutines em Unity3d

Coroutines são funções que mantém o estado enquanto devolvem a execução do código ao método que as chamou.

São úteis para o desenvolvimento de jogos para permitir a execução de determinado código ao longo de várias frames.

Por exemplo para animar a câmara do jogo podíamos executar o seguinte código:

for(int i=0;i<100;i++){
    transform.position += new Vector3(1, 0,0);
}

Se este código estiver dentro de uma função que é executada normalmente não é possível ver a câmara a mover-se ao longo do eixo dos X uma vez que a atualização do cenário do jogo só ocorre no final do ciclo e não ao longo da execução deste.

Para que seja possível ver o movimento da câmara é necessário executar um iteração do ciclo e depois atualizar a cena (fazer o render) e depois continuar a execução do ciclo com mais uma iteração e volta a atualizar a cena, neste caso o que se pretende é interromper a execução e retomar sem que se perca o estado, para isso pode-se implementar uma coroutine.

Uma coroutine não é mais do que um IEnumerator em C#, a seguinte função executa um ciclo com 100 iterações e em cada iteração a câmara move-se um valor ao longo do eixo dos X e depois interrompe a execução por 0,1 segundos. A execução continua com a atualização da variável do ciclo e mais uma iteração.

IEnumerator animaCameraPrincipal()
    {
        for(int i = 0; i < 100; i++) {
            transform.position += new Vector3(1, 0,0);
            yield return new WaitForSecondsRealtime(0.1f);
        }
    }

Esta função é executada assim:

       StartCoroutine(animaCameraPrincipal());

É muito importante não esquecer que como esta função é executada ao longo do tempo não deve ser chamada antes da sua execução estar concluída. Neste caso a execução total do código da função dura 10 segundos (0,1 x 100 = 10).

A coroutine pode ser parada de duas formas:
      - parando todas as coroutines: StopAllCoroutines();
      - parando só esta e para isso tempos de guardar uma referência para a coroutine, assim, Coroutine              funcao=StartCoroutine(animaCameraPrincipal()); e depois parando assim, StopCoroutine(funcao);



Sem comentários:

Publicar um comentário