sexta-feira, 6 de junho de 2025

UEFN Verse: Introdução aos especificadores

Especificadores são usados na linguagem Verse para definir comportamentos em alguns elementos do Verse. Os símbolos < e > são usados pelos especificadores. A função OnBegin, presente nos dispositivos Verse, tem dois especificadores: override e suspends

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

O especificador <override> indica que a função OnBegin está sobrescrevendo a função OnBegin da classe pai creative_device. Vamos ver mais detalhes do especificador <override> em um artigo sobre herança de classe.

O especificador <suspends> é usado para definir funções assíncronas que são executadas em paralelo. Isto significa que elas podem ser suspensas e depois  retomadas para continuar sua execução.

Outro especificador comum é o <decides> usado para criar expressões falíveis.  Você pode gerar uma falha dentro da função usando a expressão false? .

Se você criar uma função usando somente o especificador <decides>, ao tentar chamar a função aparecerá um erro de compilação com a seguinte mensagem:

"This invocation calls a function that has the 'no_rollback' effect, which is not allowed by its context."

Para evitar este erro, você pode usar o especificador <transacts> que indica que as expressões executadas dentro da função podem ser revertidas.

A linha abaixo mostra um exemplo de declaração de função usando <decides> e <transacts>:

    IncreaseExperience(Points: int)<decides><transacts>:void=


Vamos criar um dispositivo no UEFN aplicando estes especificadores. 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 specifiers_device clique no botão Create Empty.

Este dispositivo chamará a função IncreaseExperience uma vez por segundo passando como parâmetro um valor diferente que será adicionado a uma variável chamada ExperiencePoints. Existe uma chance de 1 em 6 da função IncreaseExperience falhar. Se ocorrer uma falha, a variável ExperiencePoints terá seu valor revertido.

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

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

specifiers_device := class(creative_device):
    
    var ExperiencePoints : int = 0

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

        var XpGain : int = 0
        
        loop:
            set XpGain += 1

            if( IncreaseExperience[XpGain] ):
                Print("XpGain is valid")
            else:
                Print("*** XpGain is INVALID ***") 
                Print("ExperiencePoints rolled back to {ExperiencePoints}")

            Sleep(1.0)

    IncreaseExperience(Points: int)<decides><transacts>:void=

        set ExperiencePoints += Points
        Print("ExperiencePoints set to {ExperiencePoints}")

        if( GetRandomInt(1, 6) = 1 ):
            false?   #isto é uma falha

Observe que na função OnBegin está sendo usado um loop sem uma expressão break ou return para sair do loop. O loop repete as expressões do seu bloco de código e a função Sleep() suspende a função OnBegin por um segundo.

A função IncreaseExperience é uma função falível devido o uso de <decides> por isso usamos [ ] ao invés de ( ) na chamada.

A função GetRandomInt() gera um número aleatório entre dois números. Os números usados como parâmetros podem fazer parte do resultado. Para usar esta função é preciso incluir o módulo Verse.org/Random no início do arquivo.

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 Verse specifiers_device ao nível. 

Clique no botão Launch Session localizado na barra de ferramentas do UEFN para carregar o nível no Fortnite. 

Após iniciar a partida no Fortnite, pressione a tecla Tab e selecione a aba Registro para visualizar o log com as mensagens escritas pelas funções Print.


Sumário Verse