quarta-feira, 7 de junho de 2023

Criando o primeiro dispositivo Verse

Nós podemos criar dispositivos no UEFN usando a linguagem de programação Verse. Neste artigo vamos ver os passos necessários.

Clique no item de menu Verse do UEFN para ver as opções disponíveis:


Clique na opção Verse Explorer para visualizar os arquivos verse existentes no projeto:


Os arquivos com digest.verse contém informações de módulos Verse. Um módulo Verse contém códigos e funções que podem ser usados em seu projeto.

Para criar um arquivo Verse no Verse Explorer, clique com o botão-direito no nome do projeto e escolha a opção Add new Verse file to project


É exibida uma janela chamada Create Verse Script. Nesta janela é possível escolher um template para o seu arquivo Verse. No momento só tem um modelo disponível para a criação de dispositivo Verse. Se quiser criar um arquivo vazio, use o botão Create Empty.

Nomes de classe em Verse seguem um padrão de nome usando apenas letras minúsculas e o caracter '_' para separar palavras. Em Device Name coloque collect_game_device e clique no botão Create para usar o código do template. 


Veja no Verse Explorer que foi criada uma nova pasta Content com o nosso arquivo Verse: 


Dê um duplo clique no arquivo Verse para abri-lo no Visual Studio Code. Se você ainda não tiver o Visual Studio Code, o UEFN vai perguntar se você quer instalar. Basta confirmar que o UEFN fará a instalação automaticamente.

A imagem abaixo mostra o arquivo Verse aberto no Visual Studio Code:



Vamos analisar o código do template para ver a estrutura básica de um arquivo Verse.

No início do arquivo temos a importação dos módulos Verse. Para usarmos uma função de algum módulo Verse existente, é preciso fazer a importação do módulo no seu arquivo Verse:
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/Diagnostics }  

As linhas que começam com o caractere # são comentários e são ignorados pelo código Verse. Os comentários são úteis para fazer algumas observações sobre a lógico do código.

# A Verse-authored creative device that can be placed in a level

A linha abaixo está declarando que collect_game_device é uma classe do tipo creative_device:

collect_game_device := class(creative_device):  

Uma classe é um tipo composto pois ela é formada por vários elementos. A creative_device é uma classe do UEFN que contém variáveis e funções necessárias para a criação de um dispositivo Verse. Nos próximos artigos vamos aprender o que são variáveis e funções. 

A classe collect_game_device está usando creative_device como superclasse (ou classe pai). Todas as variáveis e funções da classe creative_device são incluídas na classe collect_game_device. Este conceito é conhecido como herança.

As linhas abaixo de collect_game_device representam o bloco de código com as definições da classe. Verse usa indentação (recuo do texto) para definir blocos de códigos e hierarquia. A indentação geralmente possui 4 espaços em branco. Verse também aceita a definição de blocos de código usando { }

O código abaixo mostra que a função OnBegin está indentada. Isto significa que a função OnBegin faz parte da classe collect_game_device:   

collect_game_device := class(creative_device):
    OnBegin<override>()<suspends>:void=

Verse usa padrões de nomes diferentes para classes e para variáveis/funções.

Nomes de classes são em minúsculo e as palavras são separadas por _ (sublinhado) pois não pode haver espaços em branco no nome.

Ex: collect_game_device

Nomes de variáveis e funções não usam _ para separar as palavras e a primeira letra de cada palavra é em maiúsculo.

Ex: OnBegin

A função OnBegin possui outros dados ao lado do seu nome que formam a assinatura da função. Vamos identificar cada um deles:

  •  OnBegin : Nome da função.
  • <override> : Especificador que indica que esta função está sobrescrevendo uma função com o mesmo nome que existe na superclasse  creative_device.
  •  ( ) : Uma função pode receber valores através de parâmetros que são definidos dentro dos parênteses. Quando os parênteses estão vazios significa que a função não possui parâmetros.
  •  <suspends> : Especificador que indica que esta função é assíncrona. Isto significa que a função é executada em paralelo a outras funções e sua conclusão não precisa ser imediata.
  • :void : O que vem depois dos dois pontos é tipo de retorno da função. O tipo void indica que a função não retorna valor. 

A função OnBegin é executada quando o jogo inicia para o dispositivo. No código do template, a função OnBegin contém duas chamadas à função Print passando valores diferentes como parâmetro. Observe a indentação das funções Print para indicar que elas fazem parte da função OnBegin:

    OnBegin<override>()<suspends>:void=   
        Print("Hello, world!")
        Print("2 + 2 = {2 + 2}") 


A função Print escreve um texto no log do Fortnite. O parâmetro da função Print é do tipo string que é usado para armazenar texto. Sequências de caracteres entre aspas duplas " " são strings. 

Um par de chaves { } dentro de uma string representa uma expressão que será calculada e o resultado da expressão é que será armazenada na string. No exemplo do template temos a expressão {2 + 2} que será convertida para 4 na string.

Quando fizer mudanças no código Verse, é preciso compilar o código para validar as mudanças e converter o código. A compilação é feita selecionando no menu do UEFN a opção Verse > Build Verse Code. 

Para vermos o código do dispositivo Verse ser executado, o dispositivo precisa ser adicionado ao nível. Selecione o Content Drawer que fica na parte inferior da janela do UEFN.

O nosso dispositivo Verse está na pasta CollectGame Content > CreativeDevices:


Arraste o collect_game_device para o nível. Deixe um quadrado da grade livre entre o Player Spawner e o dispositivo Verse como mostra a imagem:



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 Alt e selecione a aba Log para visualizar o log com as mensagens escritas pelas funções Print:


Sumário Verse