O modelo Pista de corrida com Persistência em Verse é o modelo do Modo Criativo de criação de uma pista de corrida convertido para o UEFN, com a seguinte funcionalidade adicionada ao projeto:
Uma tabela de liderança local persistente no lobby pré-jogo usando a Persistência em Verse que só é exibida na primeira rodada.
Um sistema que atribui os jogadores aos carros na linha de partida, dependendo da ordem de chegada em uma rodada anterior, usando a Persistência em Verse.
Uma escalação inicial que exibe as estatísticas de cada jogador usando uma cena cinematográfica e Verse.
E mais!
A meta do modelo do Como projetar uma corrida de velocidade era usar os recursos da pista de corrida para criar um modo de corrida exclusivo com alguns recursos de qualidade de vida. Com esse modelo do UEFN, foi adotada uma abordagem holística para substituir e atualizar muitos recursos em todo o mapa a fim de aproveitar os recursos avançados do UEFN.
As seções a seguir exploram essas atualizações em mais detalhes.
Como atualizar a área de tutorial
Você pode encontrar a tabela de liderança na Área do Tutorial. Cada vez que você entra no mapa para sua primeira rodada, tem 30 segundos para ver a tabela de classificação atual e explorar a área de tutoriais.
Essa área foi criada para ser visualmente atraente para os jogadores que buscam diversão em corridas, além de fornecer detalhes valiosos sobre como construir um mapa igual a esse. A área do tutorial foi reformulada com base no modelo do Modo Criativo para parecer mais limpa e aberta, e foram adicionadas luzes do céu para trazer um pouco da luz natural da Lumen.
Ao carregar o modelo no UEFN, você pode ler sobre a configuração de cada grupo de dispositivos e scripts do Verse para saber como o modelo foi criado e implementá-los em suas próprias experiências.
A Área do Tutorial é onde a maioria dos nossos dispositivos está localizada, para que você possa navegar por eles e entender sua lógica. Isso inclui os principais dispositivos de retenção: Medalhas e Análises. Dispositivos de Medalhas só concedem EXP quando você termina uma volta ou uma corrida.
Você pode configurar dispositivos de Análises para rastrear vários pontos de dados e ajudar a melhorar seu projeto em atualizações futuras. Esse modelo rastreia a frequência com que cada ponto de controle é concluído e a frequência com que as pessoas pegam moedas de prata durante a corrida. Ambos fornecem dados sobre a facilidade ou dificuldade de alcançar um determinado ponto de controle ou moeda. Com base nesses dados, você pode ajustar a posição ou o número desses objetos em versões futuras para fazer com que todo o jogo flua com mais perfeição e proporcione uma melhor experiência de corrida.
Como limpar o Organizador
Após a conversão do projeto para o UEFN, o Organizador estava cheio de uma longa lista de ativos não organizados.
Embora tudo ainda funcionasse, os nomes dos veículos, barreiras e outros itens tinham números anexados, o que dificultava a compreensão da estrutura do projeto. O processo de conversão adicionou automaticamente esses números para garantir que cada ativo e dispositivo tivesse um nome exclusivo.
Para gerenciar isso, um sistema de arquivos foi adicionado ao projeto para organizar todos os objetos com base na localização e funcionalidade. Embora leve tempo para organizar, esse sistema significa que você pode mover ou excluir grupos de objetos ou áreas inteiras com muito mais eficiência do que no Modo Criativo.
Tabela de classificação local persistente
Devido à falta de dados persistentes no mapa criativo original, os vencedores de corridas anteriores e as estatísticas dos jogadores não podiam ser rastreados. No mapa modelo atualizado do UEFN, o uso do Verse e do Verse Persistence significa que podemos armazenar os dados dos jogadores em todas as sessões de jogo para monitorar as estatísticas vitalícias dos jogadores e criar tabelas de liderança locais. Você só pode acessar os dados dos jogadores que estão na sessão atual, portanto, a tabela de liderança refletirá apenas as estatísticas dos jogadores que estão jogando no momento.
Decidimos que "pódios" e "tempo de volta" seriam as estatísticas persistíveis mais importantes a serem monitoradas por jogador. Os jogadores só ganham um pódio quando ficam entre os três primeiros colocados, enquanto o melhor tempo de volta acompanha os corredores mais rápidos. Também adicionamos uma estatística extra chamada "pontos". Os jogadores recebem pontos com base na colocação durante a corrida e, portanto, aqueles que participam de muitas corridas, mas não necessariamente com uma boa pontuação, ainda podem receber um grande número de pontos. Com essas estatísticas, encontramos uma maneira de reconhecer os pilotos mais ferozes, mais rápidos e mais dedicados, tudo em um só lugar.
O modelo convertido usa um lobby pré-jogo com tabelas de liderança locais que mostram as estatísticas de vida de cada jogador. Essas estatísticas são classificadas de modo que os jogadores com a melhor estatística de pontos ao longo da vida apareçam na frente e os três melhores jogadores sejam realçados para mostrar suas habilidades. Essas estatísticas também são exibidas no HUD durante a cinemática da linha de largada, permitindo que os jogadores analisem a concorrência e se lembrem de quem devem procurar durante a corrida.
Para saber mais sobre como criar uma tabela de liderança local persistente, confira Faça sua própria tabela de liderança em Verse.
Ordem do jogador na linha de largada
O modelo convertido substitui a ordem aleatória dos corredores na linha de partida do projeto original por uma ordem que se baseia no desempenho dos corredores na rodada anterior. Isso incentiva os jogadores a terminar a corrida rapidamente, mesmo que não estejam em primeiro lugar.
Na primeira rodada, os corredores são colocados em ordem aleatória, mas, após a primeira rodada, os corredores são ordenados pela posição em que terminaram na rodada anterior. Essas informações precisam ser armazenadas entre as rodadas, mas não persistem após o término do jogo. Você pode usá-las para determinar a ordem de largada, classificando os jogadores com base na ordem de chegada anterior. Para saber como armazenar informações de arredondamento e classificar dados, consulte os tutoriais a seguir:
# Orders and returns players by their finish order in the previous round.
# During the first round, players are given random starting placements.
GetPlayerStartOrder<public>(Players:[]player):[]player=
var OrderedPlayers:[]player = Players
if:
IsFirstRound[GetRound[]]
then:
# Randomize player order because it's first round.
set OrderedPlayers = Shuffle(OrderedPlayers)
Ao atribuir jogadores a veículos e colocá-los na linha de largada, você deve se certificar de que os jogadores são realmente os que estão ativos e vão competir. Você pode criar uma função chamada GetAllValidPlayers() que percorre todos os jogadores e retorna os que ainda estão ativos (ainda não saíram do jogo) e não são espectadores (aqueles que realmente competirão).
# Get all players that are able to race.
GetAllValidPlayers(Players:[]player):[]player=
# Valid players are ones that are active and not spectating.
for:
Player : Players
Player.IsActive[]
not Player.IsSpectator[]
do:
PlayerCom tudo isso, o projeto usa o dispositivo starting_game_sequence para definir o lobby da tabela de liderança na primeira rodada e, em seguida, atribui os jogadores às posições iniciais e veículos antes de começar a corrida.
# This file handles the logic for the pregame lobby and the cinematics that play at the beginning of a race.
# It controls the length of the starting lineup based on the number of players, and plays an intro for each
# player by displaying their stats.
using { /Fortnite.com/Characters }
using { /Fortnite.com/Devices }
using { /Fortnite.com/FortPlayerUtilities }
using { /Verse.org/Native }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/Diagnostics }
Cena cinematográfica da linha de largada com estatísticas do jogador
A versão original do modelo de criação de uma pista de corrida no Modo Criativo usava o dispositivo Gatilho de Pulso para orquestrar a introdução da corrida. O Gatilho de Pulso reproduziu uma sequência de eventos em um período de tempo definido, ativando acionadores para exibir texto e ativar luzes na linha de partida.
Com o modelo convertido, o dispositivo Gatilho de Pulso foi substituído pelo dispositivo Sequência Cinematográfica do UEFN para obter uma cinematografia de abertura grandiosa. Usando o Sequenciador, você pode adicionar diferentes câmeras, elementos do Heads Up Display (HUD) e uma visualização dinâmica da escalação que se ajusta com base no número de jogadores ativos. Semelhante à configuração anterior do dispositivo de Gatilho de Pulso, a Sequência de Nível ativa os dispositivos em momentos importantes, permitindo que você determine quando exibir a pontuação do próximo jogador ou quando cortar a introdução.
Especificamente, a Sequência de Nível ativa o dispositivo Gatilho chamado StartPlayerIntroEvent sempre que a introdução de um jogador começa e ativa o dispositivo Gatilho chamado EndPlayerIntroEvent sempre que a introdução de um jogador termina. O código do Verse usa essas informações para determinar quantas introduções de jogadores já foram exibidas e interrompe a reprodução do filme se esse número for igual ao número de jogadores no jogo. Se a cinematografia terminar primeiro, ela também cancelará a espera pelas introduções dos jogadores porque está na expressão race.
O código Verse chama WaitForPlayerIntro() para cada jogador, que inicia um loop para cada jogador e espera que o dispositivo Gatilho StartPlayerIntroEvent seja ativado quantas vezes for a ordem da posição inicial do jogador para saber quando exibir as estatísticas do jogador no HUD. Cada um desses loops WaitForPlayerIntro() é chamado na função ArraySync(), que usa um algoritmo de simultaneidade de divisão e conversão para sync (sincronizar) várias funções assíncronas e elementos de matriz.
# A Verse-authored creative device that can be placed in a level
starting_game_sequence := class(creative_device):
# The cinematic that intros the players and their stats.
@editable
StartingLineupCinematic:cinematic_sequence_device = cinematic_sequence_device{}
# The cinematic that we cut to after the lineup and before the race starts.
@editable
RaceStartCinematic:cinematic_sequence_device = cinematic_sequence_device{}
O projeto usa um dispositivo Janela de Diálogo para definir o design dos widgets no Editor de Widgets e trocar as informações usando Verse. Ele faz isso definindo o texto dos botões no dispositivo de Diálogo Pop-up.
# Updates the Popup UI to display the lifetime stats of the given player during the
# race starting sequence.
UpdatePopupUI<public>(Player:agent, PopupDialogUI:popup_dialog_device):void=
if:
CurrentPlayerStats := GetPlayerStats[Player]
then:
PopupDialogUI.SetButtonText(PlayerText(Player), 0)
PopupDialogUI.SetButtonText(PointsText(CurrentPlayerStats.Points), 1)
PopupDialogUI.SetButtonText(PodiumsText(CurrentPlayerStats.Podiums), 2)
BestLapText:message = if(IsValidBestLapTime[CurrentPlayerStats.BestLapTime]):
Design de níveis
Nesta atualização, usamos o modo Landscape para criar uma pista off-road. Economizamos memória ao usar menos recursos, e as montanhas que agora cercam a pista têm mais profundidade. Também usamos volumes de água e a cachoeira para criar um novo tipo de terreno e atrair sua atenção para a próxima parte da pista de corrida.
Fizemos o upgrade do ciclo dia/noite legado de nosso projeto original para a iluminação avançada do Capítulo 4 do Fortnite. Esse novo ciclo nos permite usar o Lumen, criando sombras mais suaves e uma iluminação global realista.
Você sabia que existem mais de 120 barreiras no modelo original da pista de corrida? Barreiras eram usadas para manter os jogadores na pista e para garantir que os carros nunca saíssem dos limites. Na atualização, você verá que as barreiras são usadas apenas para manter os jogadores em seus lugares antes do início da corrida e não em toda a pista. Pontos de controle de corrida, itens coletáveis e algumas peças do ambiente foram usados para incentivar os jogadores a permanecerem na pista:
Moedas para aumentar a velocidade: ao adicionar uma plataforma de aumento de velocidade sob a última moeda em cada sequência, os jogadores são incentivados a permanecer na pista para obter o tempo de corrida mais eficiente. As moedas reaparecem a cada volta, oferecendo uma oportunidade de pegá-las novamente se os jogadores as perderem na primeira vez.
Design visual para manter os jogadores na pista: barreiras curtas e brancas foram usadas em vários lugares da pista para enfatizar o fluxo pretendido. A estrada foi projetada para ser larga o suficiente para alguns carros lado a lado. A decoração adicional e os adereços, como árvores, trailers e outros designs, foram posicionados de forma que o veículo do jogador pudesse navegar confortavelmente sem ficar preso, mas que fosse desencorajado a tomar caminhos não intencionais.
Atalhos e saltos: o mapa original era um número 8 simples, mas durante os testes descobrimos que os jogadores amavam usar saltos para pegar atalhos. No novo design, alguns atalhos e saltos foram adicionados para permitir que os jogadores escolham a maneira como desejam concluir o mapa.
No final, os pontos de controle da corrida colocados intencionalmente são a maneira final de exigir que os jogadores sigam a pista, pois cada um deles é necessário para progredir na corrida.