sábado, 7 de dezembro de 2024

UEFN Verse: Funções

Uma função é um bloco de código que pode ser executado em diferentes partes de um programa. A função é uma forma simples de reutilizar código.

Por exemplo, imagine que o seu jogo possui uma mensagem de ajuda que pode ser executada em várias situações como ao entrar em um ambiente novo ou quando o jogador pressionar um botão. Se não usarmos uma função, o bloco de código com esta mensagem de ajuda terá de ser repetido em vários locais do programa. Quando houver uma mudança no texto da mensagem, teremos de procurar todos os locais do código que tem esta mensagem tendo o risco de esquecermos um dos locais e a mensagem ficar inconsistente.

Podemos criar uma função com o objetivo de exibir a mensagem de ajuda. Nos locais do código que precisam da mensagem, colocaremos uma chamada à função. Quando for preciso mudar o texto da mensagem, basta mudar em um único lugar que é dentro da função.

O código abaixo mostra a criação de uma função com o nome ShowHelp:

ShowHelp():void = 
    Print("ShowHelp() function has no parameter or result.")

Esta é uma função bem simples que exibe uma mensagem na tela usando a função Print() da linguagem Verse. A palavra chave void indica que a função não retorna um valor de resultado.

Uma função pode ter parâmetros e retornar um resultado. Um parâmetro é um valor que é passado para a função. A função abaixo possui dois parâmetros do tipo inteiro com os nomes Level e TimeLeft e o resultado também é do tipo inteiro. A função usa uma expressão com os parâmetros e o resultado da expressão é devolvido para o local que foi feito a chamada à função.

CalculateBonus(Level:int, TimeLeft:int):int =
    Level * 10 + TimeLeft


Os dispositivos criativos do UEFN geram diversos tipos de eventos para indicar o que está acontecendo no jogo. Podemos registrar em um dispositivo uma função  para ser executada quando um evento específico ocorrer.

A função abaixo foi criada para ser chamada quando um Timer Device terminar sua contagem. 

HandleTimerFinished(MaybeAgent:?agent):void=
   Print("*** Time's Up! ***")

A função que será registrada em um evento precisa ter os parâmetros e tipo de retorno especificados no evento. Em geral estas funções não tem retorno (tipo void) e tem um parâmetro do tipo agent ou ?agent.

Nota: ?agent é um agent opcional. Isto significa que ele pode ter valor ou estar vazio. 

A linha abaixo registra a função HandleTimerFinished no evento de sucesso de um TimerDevice:

TimerDevice.SuccessEvent.Subscribe(HandleTimerFinished)


Vamos reunir os exemplos acima em um dispositivo no UEFN para vermos a sua execução na prática.

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

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

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

function_device := class(creative_device):

    @editable
    TimerDevice : timer_device = timer_device{}

    ShowHelp():void = 
        Print("ShowHelp() function has no parameter or result.")
        

    CalculateBonus(Level:int, TimeLeft:int):int =
        Level * 10 + TimeLeft


    HandleTimerFinished(MaybeAgent:?agent):void=
       Print("*** Time's Up! ***")
        

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

        TimerDevice.SuccessEvent.Subscribe(HandleTimerFinished)

        ShowHelp()

        Bonus1 := CalculateBonus(3, 25)
        Print("Bonus 1 = {Bonus1}")

        Print("Bonus 2 = { CalculateBonus(6, 12) }")


Na função OnBegin são feitas as chamadas para as funções que foram criadas e é feito o registro da função HandleTimerFinished no evento de sucesso de um Timer Device, que será executada quando o Timer Device terminar a contagem.

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 Verse function_device ao nível. Arraste também para o nível um Timer Device que pode ser encontrado na pasta Fortnite > Devices.

Selecione o function_device no nível. Na aba Details, clique no drop-down de TimerDevice e selecione o Timer Device que adicionamos 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