As coroutines são funções úteis para implementar tarefas que devem ocorrer ao longo de várias frames.
Neste posto vamos ver como animar a camera de um ponto inicial para outro ponto final com uma determinada duração em segundos. A duração da animação é armazenada numa variável para que possa ser facilmente ajustada.
A função é executada quando o utilizador premir a barrar de espaços.
void Update () {
if (Input.GetKeyDown(KeyCode.Space))
{
if(func!=null)
StopCoroutine(func);
func = StartCoroutine(smoothMoveCamera());
}
}
Precisamos de algumas variáveis:
public float duration = 2.0f;
public float xStart = -5.0f;
public float xFinish = 5.0f;
Coroutine func;
A primeira define a duração em segundas da animação. A segunda o ponto inicial e a terceira o ponto final, ao longo do eixo dos x.
Por temos uma referência para a coroutina para que seja possível parar a sua execução, se necessário.
O código da coroutina:
IEnumerator smoothMoveCamera()
{
float speed = 1 / duration;
float percent = 0;
while (true)
{
percent += speed*Time.deltaTime;
transform.position = new Vector3(Mathf.Lerp(xStart, xFinish, percent),1,-10);
yield return null;
if (percent >= 1) break;
}
}
Começamos por calcular a velocidade da animação, por segundo, dividindo 1 pela duração da animação. Esta velocidade é, dentro do ciclo, multiplicada pelo deltaTime para ajustar em função do tempo que demorou a desenhar a última frame.
Depois calculamos a nova posição usando a função Lerp com base na percentagem do tempo da animação que já está concluída e interpolando entre o ponto inicial e final.
Depois da nova posição ser definida devolvemos a execução ao Unity, com o método yield, para que possa fazer o render da frame. Depois testamos se a animação já terminou e nesse caso saímos do ciclo.
Neste posto vamos ver como animar a camera de um ponto inicial para outro ponto final com uma determinada duração em segundos. A duração da animação é armazenada numa variável para que possa ser facilmente ajustada.
A função é executada quando o utilizador premir a barrar de espaços.
void Update () {
if (Input.GetKeyDown(KeyCode.Space))
{
if(func!=null)
StopCoroutine(func);
func = StartCoroutine(smoothMoveCamera());
}
}
Precisamos de algumas variáveis:
public float duration = 2.0f;
public float xStart = -5.0f;
public float xFinish = 5.0f;
Coroutine func;
A primeira define a duração em segundas da animação. A segunda o ponto inicial e a terceira o ponto final, ao longo do eixo dos x.
Por temos uma referência para a coroutina para que seja possível parar a sua execução, se necessário.
O código da coroutina:
IEnumerator smoothMoveCamera()
{
float speed = 1 / duration;
float percent = 0;
while (true)
{
percent += speed*Time.deltaTime;
transform.position = new Vector3(Mathf.Lerp(xStart, xFinish, percent),1,-10);
yield return null;
if (percent >= 1) break;
}
}
Começamos por calcular a velocidade da animação, por segundo, dividindo 1 pela duração da animação. Esta velocidade é, dentro do ciclo, multiplicada pelo deltaTime para ajustar em função do tempo que demorou a desenhar a última frame.
Depois calculamos a nova posição usando a função Lerp com base na percentagem do tempo da animação que já está concluída e interpolando entre o ponto inicial e final.
Depois da nova posição ser definida devolvemos a execução ao Unity, com o método yield, para que possa fazer o render da frame. Depois testamos se a animação já terminou e nesse caso saímos do ciclo.
Comentários
Enviar um comentário