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")
ItemSpawner1, ItemSpawner2 e 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 e 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.