segunda-feira, 29 de setembro de 2025

UEFN Verse: Criando eventos

Eventos são usados como uma forma de comunicação entre os elementos de um jogo. Os dispositivos criativos possuem diversos eventos e é possível criar eventos em nossos dispositivos usando a linguagem verse. 

Para criar um evento com o nome MyEvent, faça assim:

MyEvent<public>:event() = event(){}

O evento pode ter parâmetros. Para definir um evento com parâmetros é preciso informar os tipos dos parâmetros. O exemplo abaixo define um evento com um parâmetro do tipo int (inteiro):

MyEventWithParameter<public>:event(int) = event(int){}

Para ativar o evento use a função Signal() do evento:

MyEvent.Signal()

Em um contexto assíncrono, use a função Await() do evento para esperar até que o evento seja ativado:

MyEvent.Await()

No momento da escrita deste artigo, a classe event não tem a interface subscribable. Isto significa que não é possível registrar uma função para ser chamada quando o evento for ativado. 

Talvez isto seja uma estratégia da Epic Games para que os programadores se adaptem à programação concorrente usando o Await().

Vamos fazer um exemplo para ilustrar o uso de eventos. Será criado um dispositivo com o nome trigger_group_device que possui um array de trigger_device

Este dispositivo possuirá um evento chamado AllTriggersActivated que será ativado quando todas as trigger_device do array forem ativadas. É uma implementação simples que assume que cada trigger_device só pode ser ativada uma vez.

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

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

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

trigger_group_device := class(creative_device):

    @editable
    TriggerGroup : []trigger_device = array{}

    var NumberOfTriggers : int = 0 

    var TriggersActivated : int = 0 

    # Criando o evento
    AllTriggersActivated<public>:event(?agent) = event(?agent){}

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

        set NumberOfTriggers = TriggerGroup.Length

        for (Trigger : TriggerGroup):
            Trigger.TriggeredEvent.Subscribe(OnTriggerActivated)


    OnTriggerActivated( MaybeAgent:?agent ):void=

        set TriggersActivated += 1

        if (TriggersActivated = NumberOfTriggers):

            # Ativando o evento
            AllTriggersActivated.Signal(MaybeAgent)

O trigger_device possui o evento TriggeredEvent. Na função OnBegin é usado o laço for para iterar no array e registrar a função OnTriggerActivated() no evento TriggeredEvent de cada trigger.

Quando o jogador ativar uma trigger, a função OnTriggerActivated() será chamada que aumenta o contador de triggers ativadas e compara com o numero total de triggers. O evento AllTriggersActivated é ativado quando todas as triggers forem ativadas. 

Salve o arquivo e compile o código Verse usando a opção Verse > Build Verse Code do menu do UEFN.

Vamos criar outro dispositivo que irá aguardar a ativação do evento  AllTriggersActivated para gerar um item usando o Item Spawner device.

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

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

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

event_device := class(creative_device):

    @editable 
    TriggerGroupDevice : trigger_group_device = trigger_group_device{}

    @editable
    ItemSpawnerDevice : item_spawner_device = item_spawner_device{}

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

        TriggerGroupDevice.AllTriggersActivated.Await()
        ItemSpawnerDevice.SpawnItem()

Na função OnBegin() é usado a função Await() do evento AllTriggersActivated que espera até sua ativação. Após a ativação, será executada a função SpawnItem() do ItemSpawnerDevice

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 os dispositivos trigger_group_device e event_device ao nível. 

Adicione quatro Trigger Device no nível. Selecione os Trigger Device e na aba Details procure pela propriedade Times Can Trigger. Marque esta propriedade e mantenha o valor 1 para que cada Trigger Device seja ativado somente uma vez.


Adicione um Item Spawner no nível. Ele será usado para gerar uma recompensa para o jogador depois que ele ativar todas os Trigger Device. Na aba Details, desmarque as propriedades Spawn Item on Timer e Respawn Item on Timer.

Para definir o item que será gerado, clique no botão + na linha do Item List. Em Pickup to Spawn, selecione o item que será gerado. Eu usei o Mythic Goldfish. 


Selecione o trigger_group_device no nível. Na aba Details adicione 4 elementos no array TriggerGroup. Para cada elemento, selecione uma instância de Trigger Device.


Selecione o event_device no nível. Na aba Details adicione as referências do trigger group device e do Item Spawner device.


Salve o nível e clique no botão Launch Session para carregar o nível no Fortnite. Passe por cima de todas as triggers para gerar o item no Item Spawner.