La plantilla Carrera en un circuito con persistencia de Verse es la plantilla del modo Creativo Diseñar una carrera en un circuito convertida a UEFN, con la siguiente funcionalidad añadida al proyecto:
Una tabla de clasificación local persistente en la sala de fase anterior a la partida que usa persistencia de Verse y que solo se muestra en la primera ronda.
Un sistema que asigna jugadores a autos en la línea de salida según su orden de llegada en una ronda anterior, mediante persistencia de Verse.
Una alineación inicial que muestra las estadísticas de cada jugador mediante una cinemática y Verse.
¡Y más!
El objetivo de la plantilla del modo Creativo Diseñar una carrera en un circuito fue usar recursos de pistas de carreras para crear un modo de carrera único con algunas características de calidad de vida. Con esta plantilla de UEFN, se utilizó un enfoque integral para reemplazar y actualizar muchas funciones en todo el mapa, para aprovechar las eficaces capacidades de UEFN.
En las siguientes secciones, se detallan mejor estas actualizaciones.
Cómo actualizar la zona del tutorial
Puedes encontrar la tabla de clasificación en la zona del tutorial. Cada vez que cargas para tu primera ronda en el mapa, obtienes 30 segundos para mirar la tabla de clasificación actual y explorar el área del tutorial.
Esta área tiene un diseño visualmente atractivo para los jugadores que buscan entretenimiento asociado a las carreras, y proporciona detalles completos sobre cómo crear un mapa igual que ese. La zona del tutorial fue rediseñada a partir de la plantilla del modo Creativo con el objetivo de que tenga un aspecto más ordenado y espacioso. Además, se añadieron luces cenitales para aportar algo de iluminación natural de Lumen.
Cuando cargas la plantilla en UEFN, puedes leer sobre la configuración de cada grupo de dispositivos y secuencias de comandos de Verse para saber cómo se creó la plantilla e implementarlos en tus propias experiencias.
La zona del tutorial es donde se encuentra la mayoría de nuestros dispositivos, para que puedas explorarlos y entender su lógica. Estos incluyen dispositivos de retención de núcleos, galardones y análisis. Los dispositivos de galardones otorgan PE (puntos de experiencia) solamente cuando das una vuelta completa o terminas una carrera.
Puedes configurar dispositivos de análisis para rastrear varios puntos de datos a modo de ayuda para mejorar tu proyecto en futuras actualizaciones. Esta plantilla rastrea con qué frecuencia se completa cada punto de control y cada cuánto recogen monedas de plata los jugadores durante la carrera. Ambos brindan datos sobre cuán fácil o difícil puede ser lograr un punto de control o una moneda. De acuerdo con estos datos, puedes ajustar la posición o el número de estos objetos en versiones futuras para hacer que todo el juego sea más fluido y proporcionar una mejor experiencia de carreras.
Cómo limpiar el esquematizador
Después de convertir el proyecto a UEFN, el esquematizador quedó abarrotado con una extensa lista de recursos desorganizados.
Si bien todo siguió funcionando, los nombres de los vehículos, las barreras y otros elementos quedaron con números anexados, lo que dificultaba la comprensión de la estructura del proyecto. El proceso de conversión añadió automáticamente estos números para garantizar que cada recurso y dispositivo tuviera un nombre único.
Para administrar esto, se añadió un sistema de archivo al proyecto para organizar todos los objetos según su ubicación y funcionalidad. Aunque lleva tiempo organizarlo, este sistema significa que puedes mover o eliminar grupos de objetos o áreas enteras de forma mucho más eficiente que en el modo Creativo.
Tabla de clasificación local persistente
Debido a la falta de datos persistentes en el mapa original del modo Creativo, no fue posible rastrear las estadísticas de los jugadores y ganadores anteriores de la carrera. En el mapa de plantilla de UEFN actualizado, el uso de Verse y de la persistencia de Verse significa que podemos almacenar datos de jugadores en todas las sesiones de juego, para monitorear las estadísticas de jugador de por vida y crear tablas de clasificación locales. Solo puedes acceder a datos de jugador de los jugadores que se encuentran en la sesión actual, así que la tabla de clasificación solo reflejará las estadísticas de los jugadores que están jugando actualmente.
Decidimos que los "podios" y el "tiempo de vuelta" sean las estadísticas persistentes más importantes para rastrear por jugador. Los jugadores solo ganan un podio cuando se posicionan entre los tres jugadores mejor clasificados, mientras que el tiempo de vuelta permite realizar un seguimiento de los competidores más rápidos. También añadimos una estadística adicional denominada “puntos”. Los jugadores consiguen puntos según su posición durante la carrera, así que los jugadores que corren mucho pero no necesariamente obtienen buenos lugares todavía pueden ganar una gran cantidad de puntos. Gracias a estas estadísticas, encontramos una manera de hacer un reconocimiento conjunto a los competidores más feroces, más rápidos y más dedicados.
La plantilla convertida utiliza una sala de fase anterior a la partida con tablas de clasificación locales que muestran las estadísticas de tiempo de vida de cada jugador. Estas estadísticas se ordenan para que los jugadores con mejores estadísticas de puntos de por vida aparezcan al principio, y se destacan los tres mejores jugadores para mostrar sus habilidades. Estas estadísticas también se muestran en el HUD durante la cinemática de la alineación inicial, lo que permite a los jugadores analizar la competencia y recordar en quién fijarse durante la carrera.
Para obtener más información sobre cómo crear una tabla de clasificación local persistente, consulta Crea tu propia tabla de clasificación en el juego.
Orden de los competidores en la línea de salida
La plantilla convertida reemplaza el orden aleatorio de los competidores en la línea de salida en el proyecto original por un orden que se basa en el rendimiento que tuvieron los competidores en la ronda anterior. Esto motiva a los jugadores a terminar la carrera rápidamente incluso cuando no están en primer lugar.
En la primera ronda, los competidores se colocan en orden aleatorio, pero después de la primera ronda, se ordenan de acuerdo con la posición que obtuvieron en la ronda anterior. Es necesario almacenar esta información entre rondas, pero no persiste una vez que finaliza el juego. Puedes usarla para determinar el orden de salida si ordenas a los jugadores según su orden de llegada anterior. Para saber cómo almacenar información de las rondas y ordenar los datos, consulta los siguientes tutoriales:
# 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)
Al asignar jugadores a vehículos y configurarlos en la línea de salida, deseas asegurarte de que los jugadores sean verdaderamente los que están activos y quiénes van a competir en la carrera. Puedes crear una función denominada GetAllValidPlayers() que analice a todos los jugadores y devuelva los que aún están activos (que todavía no dejaron la partida) y no son espectadores (que realmente van a competir).
# 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:
PlayerCon todo esto, el proyecto utiliza el dispositivo starting_game_sequence para definir la sala de la tabla de clasificación en la primera ronda, y luego asigna a los jugadores las posiciones de salida y los vehículos antes de comenzar la carrera.
# 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 }
Cinemática de la línea de salida con estadísticas de jugador
La versión original de la plantilla del modo Creativo Diseñar una carrera en un circuito utilizó el dispositivo activador de pulso para coordinar la introducción de listo-preparado-ya de la carrera. El activador de pulso reprodujo una secuencia de eventos durante un período de tiempo mediante la habilitación de activadores para mostrar texto y habilitar luces en la línea de salida.
Con la plantilla convertida, el dispositivo activador de pulso se reemplazó con el dispositivo de secuencia cinemática de UEFN para lograr la cinemática de una gran inauguración. Mediante Sequencer, puedes añadir distintas cámaras, elementos del HUD y una vista dinámica de la alineación que se ajuste según la cantidad de jugadores activos. De forma similar a cómo se configuró anteriormente el dispositivo activador de pulso, la secuencia de niveles activa los dispositivos en momentos importantes, lo que te permite determinar cuándo mostrar la puntuación del siguiente jugador o cuándo pasar a la introducción.
En concreto, la secuencia de nivel activa el dispositivo activador denominado StartPlayerIntroEvent cada vez que se inicia una introducción de jugador, y activa el dispositivo activador denominado EndPlayerIntroEvent cada vez que finaliza una introducción de jugador. El código de Verse utiliza esta información para determinar cuántas introducciones de jugador ya se mostraron y detiene la reproducción de la cinemática si es la misma que la cantidad de jugadores en el juego. Si la cinemática termina primero, también cancelará la espera de las introducciones de jugador porque está en la expresión race.
El código de Verse llama a WaitForPlayerIntro() para cada jugador, lo que inicia un bucle para cada jugador y espera a que el dispositivo activador StartPlayerIntroEvent se active tantas veces como la orden de posición inicial del jugador para saber cuándo mostrar las estadísticas del jugador en el HUD. Cada uno de estos bucles WaitForPlayerIntro() se llama en la función ArraySync(), que utiliza un algoritmo de concurrencia de divide y vencerás para sincronizar múltiples funciones asíncronas y 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{}
El proyecto utiliza un dispositivo de diálogo emergente para diseñar los widgets en el editor de widgets e intercambiar la información con Verse. Lo hace estableciendo el texto de los botones en el dispositivo de diálogo emergente.
# 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]):
Diseño de nivel
En esta actualización, utilizamos el modo terreno para crear una pista todoterreno. Utilizamos menos recursos para ahorrar memoria, y las montañas que ahora rodean la pista tienen más profundidad. También utilizamos volúmenes de agua y la cascada para crear un nuevo tipo de terreno y atraer tu mirada hacia la siguiente parte de la pista de carrera.
Actualizamos el ciclo de día/noche heredado de nuestro proyecto original con la iluminación avanzada del Capítulo 4 de Fortnite. Este nuevo ciclo nos permitió utilizar Lumen y crear sombras más suaves e iluminación global realista.
¿Sabías que existen más de 120 barreras en la plantilla de pista de carrera original? Las barreras se usaban para que los jugadores siguieran la dirección correcta y para garantizar que los autos nunca se salieran de los límites. En la actualización, verás que las barreras solo se usan para mantener a los jugadores en su lugar antes de que empiece la carrera y que no anden por toda la pista. Se usaron puntos de control de carrera, coleccionables y algunas piezas del entorno para motivar a los jugadores a seguir la dirección correcta:
Monedas de potencia: al añadir una plataforma potenciadora de velocidad bajo la última moneda en cada racha, se alienta a los jugadores a mantenerse en el camino para conseguir el tiempo de carrera más eficaz. Las monedas se regeneran en cada vuelta, lo que proporciona a los jugadores una oportunidad para volver a recogerlas si las pierden la primera vez.
Diseño visual para mantener a los jugadores en la pista: se utilizaron barreras blancas cortas en muchos lugares a lo largo de la pista para enfatizar el flujo previsto de la pista. La carretera se diseñó para que tenga el ancho suficiente para unos cuantos autos uno al lado del otro. La decoración y la utilería adicionales, como los árboles, las caravanas y otros diseños, se colocaron de manera que el vehículo de un jugador debería poder navegar cómodamente sin quedar atascado, aunque se le desanimaría a tomar rutas no previstas.
Atajos y saltos: el mapa original era un simple ocho, pero en las pruebas de juego descubrimos que a los jugadores les encantaba utilizar los saltos para tomar atajos. En el diseño nuevo, se añadieron algunos atajos y saltos para que los jugadores puedan elegir la forma en que desean completar el mapa.
Al final, los puntos de control de la carrera ubicados de forma intencional son la forma definitiva de exigir a los jugadores que sigan el camino, ya que cada uno es necesario para avanzar en la carrera.