domingo, 3 de agosto de 2025

UEFN Verse: Sync (fluxo de tempo)

Fluxo de tempo na linguagem Verse se refere à concorrência entre as expressões assíncronas sendo possível especificar como elas se relacionam.

Sync é uma das expressões estruturadas assíncronas. Ela tem de ser usada em um contexto assíncrono que é uma função com o especificador suspends como a função OnBegin().

A expressão sync executa outras expressões simultaneamente e só finaliza quando todas as expressões em seu bloco finalizarem.

O código abaixo mostra um exemplo simples da expressão sync: 

    OnBegin<override>()<suspends>:void=

        sync:
            Trigger1.TriggeredEvent.Await()
            Trigger2.TriggeredEvent.Await()
            Trigger3.TriggeredEvent.Await()
        
        Print("Os três Triggers foram ativados")

Trigger1, Trigger2 e Trigger3 são instâncias de trigger_device. A função Await() espera até que o evento seja ativado. A expressão sync finaliza quando os três triggers forem ativados.

Vamos criar um dispositivo no UEFN com este exemplo de syncEm 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 sync_device clique no botão Create Empty.

Copie o código Verse abaixo para o dispositivo sync_device:

using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/Diagnostics }

sync_device := class(creative_device):

    @editable
    Explosive : explosive_device = explosive_device{}

    @editable
    Trigger1 : trigger_device = trigger_device{}

    @editable
    Trigger2 : trigger_device = trigger_device{}

    @editable
    Trigger3 : trigger_device = trigger_device{}

    OnBegin<override>()<suspends>:void=

        EventsOutput := sync:
            Trigger1.TriggeredEvent.Await()
            Trigger2.TriggeredEvent.Await()
            Trigger3.TriggeredEvent.Await()
        
        MaybeAgent := EventsOutput(0)

        if(Agent := MaybeAgent?):
            Explosive.Explode(Agent)

Este dispositivo possui referências para três trigger_device e um explosive_device. O explosivo será detonado quando os três triggers forem ativados. 

No exemplo o EventsOutput está sendo usado para armazenar o retorno da expressão sync. O retorno da expressão sync é uma tupla contendo o retorno de cada função.

A função Await() retorna um ?agent (option agent) que precisa ser convertida para um agent para ser passado como parâmetro na função Explode().

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 nosso dispositivo sync_device ao nível. Adicione também três Trigger Device e um Explosive Device. Coloque o Explosive Device longe dos Trigger Device ou diminua o alcance da explosão para evitar que o jogador seja atingido. 


Selecione o sync_device no nível. Na aba Details adicione as referências dos dispositivos.


Salve o nível e clique no botão Launch Session para carregar o nível no Fortnite. Passe por cima dos três triggers para detonar o explosivo.