Defer é uma expressão de controle de fluxo que executa um bloco de código somente depois que o escopo atual encerrar. Por exemplo, o Defer é usado em uma função então seu bloco de código só será executado depois que a função concluir ou for cancelada.
O Defer é útil para resetar variáveis e limpar recursos que foram usados. Também é uma boa opção para colocar códigos que precisam ser executados no final de uma função grande que possui muitos locais diferentes de finalização. Dessa forma os códigos não precisam ser repetidos em todos os locais.
No exemplo abaixo, PropMove é um creative_prop e InitialTransform é um transform (posição, rotação e escala).
defer:
if ( PropToMove.TeleportTo[ InitialTransform ] ) {}
A função TeleportTo não é executada imediatamente. Ela só será executada quando o escopo atual encerrar. O objetivo é voltar o creative prop à sua posição inicial.
A expressão if é necessária porque a função TeleportTo é uma expressão falível.
Vamos criar um exemplo para ilustrar este uso da expressão Defer. Neste exemplo um creative prop se moverá em direção ao jogador. O jogador precisa ativar uma trigger para parar a perseguição. O creative prop voltará a sua posição inicial quando for desativado.
Em qualquer projeto UEFN, abra o Verse Explorer, clique com o botão-direito no nome do projeto e escolha a opção Add new Verse file to project.
Em Device Name coloque defer_device e clique no botão Create Empty.
Copie o código Verse abaixo para o dispositivo defer_device:
using { /Fortnite.com/Devices }
using { /Fortnite.com/Characters }
using { /Fortnite.com/Playspaces }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/Diagnostics }
using { /UnrealEngine.com/Temporary/SpatialMath }
defer_device := class(creative_device):
@editable
PropToMove : creative_prop = creative_prop{}
@editable
Trigger : trigger_device = trigger_device{}
OnBegin<override>()<suspends>:void=
race:
FollowPlayer()
Trigger.TriggeredEvent.Await()
FollowPlayer()<suspends>:void=
if:
Player := GetPlayspace().GetPlayers()[0]
Character := Player.GetFortCharacter[]
then:
InitialTransform := PropToMove.GetTransform()
PropRotation := PropToMove.GetTransform().Rotation
defer:
# Retornar à posição inicial ao sair do escopo (cancelar ou concluir)
if ( PropToMove.TeleportTo[ InitialTransform ] ) {}
loop:
NewTranslation := Character.GetTransform().Translation
PropToMove.MoveTo( NewTranslation, PropRotation, 5.0 )
A função OnBegin possui apenas uma expressão race com duas expressões concorrentes. Quando o trigger for ativado, a função FollowPlayer() será cancelada e a expressão associada ao defer será executada.
Na função FollowPlayer() precisamos obter a referência para a instância de FortCharacter do primeiro jogador para pegar a sua posição atual. A expressão GetPlayspace().GetPlayers() retorna um array com os jogadores. Como queremos somente o primeiro jogador, a indexação [0] foi usada para pegar o primeiro elemento do array que retorna da função GetPlayers().
Salve o arquivo e compile o código Verse usando a opção Verse > Build Verse Code do menu do UEFN.
Acesse o Content Drawer e adicione o dispositivo defer_device ao nível. Adicione um Trigger Device longe da posição inicial do jogador. Precisamos de um creative_prop que será usado para perseguir o jogador. No meu exemplo eu usei o Gnome02, mas você pode escolher qualquer um.
Selecione o defer_device no nível. Na aba Details adicione as referências do creative prop e do trigger.
Salve o nível e clique no botão Launch Session para carregar o nível no Fortnite. Observe o creative prop se movendo em sua direção. Passe por cima da trigger para parar a perseguição e retornar o creative prop à sua posição inicial.