terça-feira, 2 de dezembro de 2014

O Evento Tick e as Ações Latentes em Blueprints

A Unreal Engine 4 possui um evento chamado "Tick" que é gerado a cada quadro do jogo. Por exemplo em um jogo que estiver rodando a 60 quadros por segundo, o evento "Tick" será gerado 60 vezes em um segundo.

O Evento "Tick" fornece um valor conhecido como "Delta Seconds" que representa a variação do tempo em relação ao último quadro. Usando o Evento "Tick" podemos ter um controle preciso sobre a movimentação de um Blueprint no jogo.

Para ilustrar o uso do Evento "Tick", vamos criar um exemplo bem simples que move um Ator ao longo do Eixo X. A velocidade do movimento está armazenada em um variável do tipo Float (fracionária) chamada "SpeedX". O valor padrão que estou usando para esta variável é 100, o que representa a velocidade de 100 centímetros por segundo, pois na Unreal Engine 4, uma Unidade Unreal equivale a 1 centímetro. (1 uu = 1 cm)

O script deste exemplo fica assim:

Clique para aumentar

A Ação "Add Actor World Offset" modifica a localização do Ator de acordo com o valor passado no parâmetro de entrada chamado "Delta Location", que é um Vetor contendo os valores de posição nos eixos X, Y e Z. Neste exemplo só queremos modificar o Eixo X, por isso os valores dos Eixos Y e Z estão com zero.

Precisamos multiplicar o valor de "Delta Seconds" pela velocidade que está na variável "SpeedX" para encontrarmos o valor equivalente ao pequeno passo que o Ator precisa mover no Eixo de X a cada quadro.

Para compreender melhor este cálculo vamos fazer uma simulação assumindo que o jogo está rodando a 50 quadros por segundo. Para calcular o valor de "Delta Seconds" basta dividir 1 segundo pelo número de quadros, ou seja:

Delta Seconds = 1 seg / 50 
Delta Seconds = 0,020 seg (equivale a 20 milisegundos)

Agora para descobrir o valor X que o Ator irá mover a cada quadro, basta multiplicar o valor de "Delta Seconds" pelo valor de "SpeedX" :

X = SpeedX * Delta Seconds
X = 100 cm/seg * 0,020 seg
X = 2 cm

Em média, o Ator irá se mover 2 cm a cada quadro nesta simulação.

A Unreal Engine 4 possui um tipo de Ação conhecido como Latente. As Ações Latentes possuem como característica o fato de que a sua execução ocorre em paralelo ao Fluxo normal do script de um Blueprint. Sendo assim, a conclusão de uma Ação Latente pode ocorrer vários quadros após o seu início.

A Ação Latente mais simples e mais comum é a função "Delay", que executa as ações ligadas ao pino "Completed" somente após ter passado o tempo contido no parâmetro "Duration". A imagem abaixo mostra a Ação "Delay" com uma breve descrição:


Outro exemplo de Ação Latente é a "Timeline", que será o tópico do próximo artigo.

Para ilustrar o uso da Função "Delay", vamos criar um script que calcula de uma forma simples a taxa de quadros por segundo (frames per second) que o jogo está sendo executado. 

Para começar, crie um novo Blueprint contendo as três variáveis inteiras que estão na imagem abaixo. Todas elas estão marcadas como "editáveis" para facilitar a visualização de seus valores no editor. Criei uma categoria chamada "FPS" para agrupar estas variáveis.


O script usa o Evento "Tick" junto com a função "Delay". A variável "Frames" conta o número de quadros que já foram processados. Usamos a função "Delay" para calcularmos a taxa de quadros por segundo a cada 5 segundos. 

O cálculo é feito baseado na subtração entre as variáveis "Frames" e "Checkpoint" que representa quantos quadros passaram em 5 segundos. Este resultado será dividido por 5 para encontrarmos o valor médio da taxa de quadros por segundo. Depois guardamos o valor atual da variável "Frames" na variável "Checkpoint" que servirá como referência para o próximo cálculo.

O script ficou desta forma:


Ao executar este script podemos observar que o fluxo de execução não passa pela função "Delay" enquanto não terminar a sua contagem interna que é exibida no editor:


A imagem abaixo mostra alguns valores das variáveis durante a execução do meu exemplo que calculou uma média de 32 quadros por segundo.


Devido a forma de execução das Ações Latentes, elas não podem ser usadas dentro de uma Função Blueprint. A imagem abaixo mostra o erro de compilação gerado ao tentar usar uma Ação Latente dentro de uma função que criei com o nome "Test Latent".



Próximo: Usando Timelines em Blueprints
Anterior: Usando Event Dispatcher em Blueprints
Sumário