sexta-feira, 8 de agosto de 2025

UEFN Verse: Race (fluxo de tempo)

Race é uma das principais expressões de controle de fluxo de tempo da linguagem Verse, pois ela permite uma forma organizada de abortar outros códigos assíncronos.

A expressão race executa outras expressões simultaneamente e finaliza assim que uma das expressões em seu bloco finalizar. As outras expressões dentro do race são abortadas.

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

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

        race:
            ItemSpawner1.ItemPickedUpEvent.Await()
            ItemSpawner2.ItemPickedUpEvent.Await()
            ItemSpawner3.ItemPickedUpEvent.Await()
            
        Print("Um dos itens foi coletado")

ItemSpawner1ItemSpawner2 ItemSpawner3 são instâncias de item_spawner_device. A função Await() espera até que o evento seja ativado. A expressão race finaliza quando um dos itens for coletado.

Para exemplificar o uso da expressão race vamos criar um minigame. O objetivo do minigame é coletar um determinado número de moedas dentro do tempo especificado. Estes valores serão armazenados em campos e editáveis para que possam ser configurados no dispositivo Verse.

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 race_device clique no botão Create Empty.

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

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

race_device := class(creative_device):

    @editable
    ItemSpawner1: item_spawner_device = item_spawner_device{} 

    @editable
    ItemSpawner2: item_spawner_device = item_spawner_device{} 

    @editable
    ItemSpawner3: item_spawner_device = item_spawner_device{} 

    @editable 
    ChallengeTimeInSeconds : float = 60.0

    @editable
    NumberOfItemsToWin : int = 10

    var ItemCount : int = 0

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

        race:
            loop:
                race:
                    ItemSpawner1.ItemPickedUpEvent.Await()
                    ItemSpawner2.ItemPickedUpEvent.Await()
                    ItemSpawner3.ItemPickedUpEvent.Await()

                set ItemCount += 1
                Print("Items Collected: {ItemCount}")

                if(ItemCount >= NumberOfItemsToWin):
                    Print("WIN: Goal achieved")
                    break

            block:
                Sleep(ChallengeTimeInSeconds)
                Print("LOSE: Time expired!")

Este dispositivo possui referências para três item_spawner_device. Estes dispositivos vão gerar as moedas para serem coletadas pelo jogador.

A expressão race está sendo usada duas vezes na função OnBegin. O primeiro race possui duas expressões concorrentes:

  • loop: Repete as expressões em seu bloco de código até ser interrompido por uma expressão break ou abortado. No exemplo o loop é responsável por contar as moedas coletadas e encerra quando a quantidade de moedas armazenada em NumberOfItemsToWin for alcançada.
  • block: É usado para agrupar expressões. As expressões dentro do block são tratadas como uma única expressão para o race. No exemplo o block tem uma função Sleep que vai esperar até acabar o tempo do desafio.

O primeiro race vai concluir quando o jogador atingir o objetivo ou quando o tempo acabar.

O segundo race está dentro do bloco de código do loop. Ele conclui quando uma das moedas for coletada. O restante do código do loop é executado e o race é executado de novo se o loop ainda estiver ativo. 

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 race_device ao nível. Adicione também três Item Spawner Device e coloque-os longe uns dos outros.



Em cada um dos Item Spawner Device, adicione um elemento no Item List e em Pickup to Spawn escolha o item Gold. Em Time Before First Spawn coloque 0.0 para que o item apareça no nível ao começar o jogo. Em Time Between Spawns coloque valores diferentes em cada um dos dispositivos. No meu exemplo eu usei 5.0s, 10.0s e 15.0s.


Selecione o race_device no nível. Na aba Details adicione as referências dos Item Spawner Devices. Você também pode modificar os valores usados no  desafio do minigame.


Salve o nível e clique no botão Launch Session para carregar o nível no Fortnite. Colete a quantidade de moedas necessárias antes do tempo acabar para vencer o desafio.