terça-feira, 16 de setembro de 2025

UEFN Verse: Tupla

Uma Tupla é um container que armazena de uma forma simples uma sequência de elementos que podem ser de tipos diferentes. Os elementos da Tupla podem ser acessados por um índice que indica a posição.

No exemplo abaixo, PersonData é uma Tupla com três elementos do tipo string, int e float

PersonData : tuple(string, int, float) = ("Romero", 47, 1.80)

Print("Name: { PersonData(0) }")
Print("Age: { PersonData(1) }")
Print("Height: { PersonData(2) }")

Uma das utilidades da Tupla é permitir que uma função retorne mais de uma valor. O tipo de retorno de uma função pode ser uma Tupla com vários elementos como mostra o código a seguir.

GenerateWarriorData(): tuple(string, int, float) =

    var Name : string = ""

    if( RandomName := WarriorNames[ GetRandomInt(0, WarriorNames.Length - 1) ] ):
        set Name = RandomName 
	
    ArmorLevel := GetRandomInt(2,6)

    Speed := GetRandomFloat(5.0, 10.0)

    # Retorna esta tupla
    ( Name, ArmorLevel, Speed )

WarriorNames é um array de string que possui alguns nomes armazenados. A função GenerateWarriorData gera alguns valores aleatórios que são retornados dentro de uma Tupla.

Outra característica interessante da Tupla é que ela pode ser passada para uma função quando os parâmetros da função tem os tipos equivalentes aos elementos da Tupla. Isto será demonstrado no exemplo principal deste artigo.

Um elemento de uma Tupla pode ser um array ou outra Tupla. Minha sugestão é de não criar Tuplas complexas com muitos elementos porque o programador vai precisar checar o significado de cada elemento e isso pode provocar erros difíceis de encontrar. 

Ao invés de criar uma Tupla complexa, crie uma struct ou class com os nomes de campos bem definidos.

No dispositivo Verse de exemplo, será mostrado diferentes forma de chamar uma função com Tuplas. 

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

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

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

tuple_device := class(creative_device):

    WarriorNames : []string = array{"Archon", "Aryss", "Alarik", "Dessloch", 
                   "Cryss", "Nikita", "Drimacus", "Rhea", "Raynor", "Kira"}

    OnBegin<override>()<suspends>:void=
        
        var Warrior1 : tuple(string, int, float) = ("", 0, 0.0)

        set Warrior1 = GenerateWarriorData()

        Warrior2 := GenerateWarriorData()

        ShowWarriorData( Warrior1(0), Warrior1(1), Warrior1(2) )

        ShowWarriorData( Warrior2 )

        ShowWarriorData( GenerateWarriorData() )

    GenerateWarriorData(): tuple(string, int, float) =

        var Name : string = ""

        if( RandomName := WarriorNames[ GetRandomInt(0, WarriorNames.Length - 1) ] ):
            set Name = RandomName 
        
        ArmorLevel := GetRandomInt(2,6)

        Speed := GetRandomFloat(5.0, 10.0)

        # Retorna esta tupla
        ( Name, ArmorLevel, Speed )

    ShowWarriorData(Name:string, ArmorLevel:int, Speed:float):void =
        Print("Name: {Name} | Armor Level: {ArmorLevel} | Speed: {Speed}")

A função ShowWarriorData() é chamada 3 vezes:

  • Na primeira vez, cada elemento da tupla é acessado pelo índice e passado como parâmetro. 
  • Na segunda vez, a Tupla é passado como parâmetro. Isto é permitido quando os tipos dos elementos da Tupla são equivalentes aos tipos dos parâmetros da função.
  • Na terceira vez, a Tupla resultante da função GenerateWarriorData() será passada como parâmetro.


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 tuple_device ao nível. Salve o nível e clique no botão Launch Session 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 mensagem escritas com os dados gerados.