Neste artigo vou apresentar noções básicas do uso de persistência no UEFN usando Verse.
Primeiro vamos esclarecer sobre o que estamos falando ao mencionar persistência. Em uma ilha padrão do Fortnite, quando um jogador sai da experiência, os seus dados relacionados a experiência, como pontos ou itens coletados, são perdidos.
O uso de persistência permite que alguns dados associados ao jogador sejam salvos na experiência. Quando o jogador retornar à experiência, estes dados podem ser recuperados permitindo que o jogador continue de onde parou.
Para persistir os dados dos jogadores, é preciso criar uma variável global do tipo weak_map usando o tipo player como chave. Weak map é um tipo de map que não permite a listagem de seus elementos para iteração. A única forma de acessar um elemento de um weak map é usando o índice. Se você não sabe o que é um map, eu sugiro a leitura do meu artigo:
A linha abaixo mostra como criar uma variável do tipo weak_map com o nome PlayerData que usa o tipo player como chave e o tipo float como valor. A declaração desta variável precisa estar fora de uma classe para que ela seja global.
var PlayerData:weak_map(player, float) = map{}
Para ficar claro o uso da persistência, vamos começar com um exemplo simples usando um Timer Device e um Button Device. O Timer Device será configurado para contar para cima. Quando o jogador pressionar o botão, o valor atual do Timer será salvo. Quando o jogador entrar de novo na experiência, o valor do timer será recuperado e atribuido ao timer para que ele não comece a contagem do zero de novo.
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 persistence_device e clique no botão Create Empty.
Copie o código Verse abaixo para o dispositivo persistence_device:
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/Diagnostics }
var PlayerData:weak_map(player, float) = map{}
persistence_device := class(creative_device):
@editable
TimerDevice: timer_device = timer_device{}
# O timer precisa contar para cima.
@editable
SaveButton : button_device = button_device{}
OnBegin<override>()<suspends>:void =
SaveButton.InteractedWithEvent.Subscribe(ButtonPressed)
if: # Recupera dados salvos se existir.
Player := GetPlayspace().GetPlayers()[0]
TimeElapsed := PlayerData[Player]
then:
TimerDevice.SetActiveDuration(TimeElapsed, Player)
ButtonPressed(Agent:agent):void=
if:
Player := player[Agent]
set PlayerData[Player] = TimerDevice.GetActiveDuration(Agent)
then:
Print("Dados salvos.")
A função OnBegin registra a função ButtonPressed no evento InteractedWithEvent do SaveButton e verifica se existe um valor salvo para o jogador atual acessando o weak_map com a expressão PlayerData[Player].
A função ButtonPressed obtém a contagem atual do Timer Device usando a função GetActiveDuration e salva no weak_map usando o jogador atual como chave.
Salve o arquivo e compile o código Verse usando a opção Verse > Compile Verse Code do menu do UEFN.
Acesse o Content Drawer e adicione o dispositivo persistence_device ao nível. Adicione um Timer Device e um Button Device e deixe eles próximos um do outro.
Selecione o Timer Device no nível. Na aba Details selecione CountUp em Count Down Direction. Coloque um valor alto em Duration. No meu exemplo eu usei 600 segundos (10 minutos). Marque a opção Start at Game Start.
Selecione o persistence_device no nível. Na aba Details adicione as referências do Timer Device e do Button Device.
Salve o nível e clique no botão Launch Session para carregar o nível no Fortnite. Espere por alguns segundos dentro do jogo e depois use o seu personagem para pressionar o botão no nível. Quando o botão for pressionado, o valor atual do timer será persistido.
Para você conseguir simular o uso da persistência localmente não encerre a sessão do UEFN. No Fortnite aperte ESC para sair da experiência atual sem sair da sessão do UEFN.
Quando entrar novamente na experiência com o mesmo jogador, o Timer Device iniciará sua contagem a partir do valor que foi salvo.
No próximo artigo, vou abordar mais alguns conceitos de persistência e mostrar a forma que ela é geralmente usada nas experiências.
Só um alerta. Evite fazer experimentações de persistência em ilhas que estão publicadas. Este é um tópico que necessita conhecimento e planejamento para evitar que alterações futuras nas variáveis usadas para salvar façam os jogadores perderem seus dados salvos.




