La plantilla Juego de carreras con persistencia de Verse es la plantilla del modo Creativo Cómo diseñar un juego de carreras convertida a UEFN con la siguiente funcionalidad añadida al proyecto:
Un marcador local persistente en la sala previa a la partida mediante la persistencia de Verse que solo se muestra en la primera ronda.
Un sistema que asigna jugadores a coches en la línea de inicio en función de su orden de finalización en la ronda anterior, mediante la persistencia de Verse.
Una alineación inicial que muestra las estadísticas de cada jugador con una cinemática y Verse.
¡Y mucho más!
El objetivo de la plantilla del modo Creativo Diseñar un juego de carreras era utilizar recursos de pistas de carreras para crear un modo de carrera único con algunas funciones de usabilidad. Con esta plantilla UEFN, se ha adoptado un enfoque holístico para sustituir y actualizar muchas funciones en todo el mapa, con el fin de aprovechar las potentes capacidades de UEFN.
Las siguientes secciones exploran estas actualizaciones en más detalle.
Cómo actualizar la zona de tutoriales
Puedes encontrar el marcador en la zona de tutoriales. Cada vez que inicies tu primera ronda en el mapa, dispondrás de 30 segundos para consultar el marcador actual y explorar la zona de tutoriales.
Esta zona se ha creado para que resulte visualmente atractiva a los jugadores que buscan divertirse y competir en carreras, al tiempo que ofrece detalles sobre cómo construir un mapa justo como este. La zona de tutoriales se rediseñó a partir de la plantilla del modo Creativo para que pareciera más limpia y abierta y se añadieron luces cenitales para que entrara algo de esa iluminación natural de Lumen.
Cuando cargues la plantilla en UEFN, podrás obtener información sobre la configuración de cada grupo de dispositivos y scripts Verse para aprender cómo se construyó la plantilla e implementarlos en tus propias experiencias.
La zona de tutoriales es donde se encuentra la mayoría de nuestros dispositivos para que puedas buscarlos y entender su lógica. Estos incluyen dispositivos de retención de núcleo, menciones y análisis. Los dispositivos de menciones solo otorgan experiencia al finalizar una vuelta o una carrera.
Puedes configurar dispositivos de análisis para que realicen un seguimiento de distintos puntos de datos para ayudarte a mejorar tu proyecto en próximas actualizaciones. Esta plantilla realiza un seguimiento de la frecuencia con la que se completa cada punto de control y la frecuencia con la que la gente recoge monedas de plata durante la carrera. Ambas proporcionan información sobre lo fácil o difícil que es alcanzar un punto de control o moneda en particular. En función de estos datos, puedes ajustar la posición o el número de objetos en futuros lanzamientos para que el juego fluya más y proporcionar una experiencia mejor de carrera.
Cómo limpiar el esquematizador
Tras convertir el proyecto a UEFN, el esquematizador se llenó de una larga lista de recursos sin organizar.
Aunque todo seguía funcionando, los nombres de los vehículos, barreras y otros elementos contaban con números unidos a ellos, 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 gestionarlo, se añadió al proyecto un sistema de archivos para organizar todos los objetos en función de su ubicación y funcionalidad. Aunque lleva tiempo organizarlo, este sistema permite mover o eliminar grupos de objetos o áreas enteras con mucha más eficacia que en el modo Creativo.
Marcador local persistente
Debido a la falta de datos persistentes en el mapa original del modo Creativo, no se podía hacer un seguimiento de los ganadores de carreras anteriores ni de las estadísticas de los jugadores. En el mapa de plantillas actualizado de UEFN, el uso de Verse y de su persistencia significa que podemos almacenar los datos de los jugadores en todas las sesiones de juego, para controlar las estadísticas de por vida de los jugadores y crear marcadores locales. Solo puedes acceder a los datos de los jugadores que estén en la sesión actual, por lo que el marcador solo reflejará las estadísticas de los jugadores que estén jugando en ese momento.
Decidimos que los «podios» y el «tiempo de vuelta» serían las estadísticas persistentes más importantes para cada jugador. Los jugadores solo ganan un podio cuando se sitúan entre los 3 primeros clasificados, mientras que el mejor tiempo de vuelta sigue la pista de los corredores más rápidos. También hemos añadido una estadística más llamada "puntos". Los jugadores reciben puntos en función de su posición en la carrera, por lo que los jugadores que participan en muchas carreras pero no quedan necesariamente en buena posición pueden ganar un gran número de puntos. Con estas estadísticas, hemos encontrado una forma de reconocer a los corredores más feroces, más rápidos y más entregados, todo en uno.
La plantilla convertida utiliza una sala previa a la partida con marcadores locales que muestran las estadísticas de todo el historial de cada jugador. Estas estadísticas se ordenan de modo que los jugadores con las mejores estadísticas de puntos de por vida aparezcan al principio y los tres mejores jugadores se resalten para mostrar su habilidad. Estas estadísticas también se muestran en el HUD durante la cinemática de la alineación de salida, lo que permite a los jugadores echar un vistazo a sus oponentes y recordar a quién deben tener en cuenta durante la carrera.
Para obtener más información sobre cómo crear un marcador local persistente, consulta Cómo crear tu propio marcador dentro de juego.
Orden de los participantes de la carrera en la línea de salida
La plantilla convertida sustituye el orden aleatorio de los participantes de la carrera en la línea de salida del proyecto original por un orden basado en lo bien que lo hicieron los corredores en la ronda anterior. Esto anima a los jugadores a terminar la carrera rápidamente aunque no estén en primer lugar.
En la primera ronda, los participantes se colocan en orden aleatorio, pero después de la primera ronda, se ordenan por la posición en la que terminaron en la ronda anterior. Esta información debe almacenarse entre rondas, pero no persiste una vez finalizada la partida. Puedes utilizarlo para determinar el orden de salida al ordenar a los jugadores en función de su orden de llegada anterior. Para obtener más información sobre cómo almacenar información sobre 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 los jugadores a los vehículos y colocarlos en la línea de salida, debes asegurarte de que los jugadores son realmente los que están activos y van a competir. Puedes crear una función denominada GetAllValidPlayers() que pase por todos los jugadores y devuelva los que todavía están activos (no han abandonado el juego todavía) y no son espectadores (estarán compitiendo de verdad).
# 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 configurar la sala del marcador en la primera ronda y, a continuación, asignar a los jugadores posiciones de salida y vehículos antes de empezar 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 }
Cómo iniciar una cinemática de línea con las estadísticas de los jugadores
La versión original de la plantilla del modo Creativo Cómo diseñar un juego de carreras utilizaba el dispositivo Activador de pulsos para orquestar la introducción ¡preparados, listos, ya! para la carrera. El activador de pulsos reproduce una secuencia de eventos durante un periodo de tiempo determinado al activar los activadores para mostrar el texto y habilitar las luces en la línea de salida.
Con la plantilla convertida, el dispositivo Activador de pulsos se ha sustituido por el dispositivo Secuencia cinemática de UEFN para conseguir una gran cinemática de apertura. Con Sequencer, puedes añadir diferentes cámaras, elementos de la interfaz de juego (HUD) y una vista de alineación dinámica que se ajusta en función de la cantidad de jugadores activos. Al igual que en la configuración anterior del dispositivo Activador de pulsos, la secuencia de niveles activa los dispositivos en momentos importantes, lo que permite determinar cuándo mostrar la puntuación del siguiente jugador o cuándo cortar la introducción.
En concreto, la secuencia de nivel activa el dispositivo Activador denominado StartPlayerIntroEvent cuando se inicia la introducción de un jugador y activa el dispositivo Activador nombrado EndPlayerIntroEvent cuando dicha introducción acaba. El código de Verse utiliza esta información para determinar cuántas introducciones de jugadores se han mostrado ya y detiene la reproducción de la cinemática si es igual al número de jugadores en la partida. Si la cinemática termina primero, también cancelará la espera de las introducciones de los jugadores porque está en la expresión race.
El código del Verso llama a WaitForPlayerIntro() con cada jugador, lo cual inicia un bucle con cada uno y espera a que el dispositivo Activador StartPlayerIntroEvent se active tantas veces como el orden de posición inicial del jugador para saber cuándo mostrar las estadísticas del jugador en el HUD. Se llama a cada uno de estos bucles WaitForPlayerIntro() en la función ArraySync(), que utiliza un algoritmo de concurrencia «divide y vencerás» para sincronizar varias funciones asíncronas y elementos de matrices.
# 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 Diálogo emergente para diseñar los widgets en el editor de widgets e intercambiar la información con Verse. Para ello, establece el texto de los botones en el dispositivo Cuadro 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 niveles
En esta actualización, hemos utilizado el modo Paisaje para crear una pista todoterreno. Hemos ahorrado memoria al utilizar menos recursos, y las montañas que rodean ahora la pista tienen más profundidad. También utilizamos los volúmenes de agua y la cascada para crear un nuevo tipo de terreno y atraer la mirada hacia la siguiente parte de la pista de carreras.
Hemos pasado del ciclo día/noche heredado de nuestro proyecto original a la iluminación avanzada del capítulo 4 de Fortnite. Este nuevo ciclo nos ha permitido utilizar Lumen y crear sombras más suaves e iluminación global más realista.
¿Sabías que hay más de 120 barreras en la plantilla original de la pista de carreras? Se utilizaban barreras para mantener a los jugadores en la pista y garantizar que los coches 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 sitio antes de que empiece una carrera y no por toda la pista. Se han utilizado puntos de control para la carrera, objetos coleccionables y algunas piezas del entorno para animar a los jugadores a no salirse de la pista:
Monedas de impulso: al añadir una almohadilla de aumento de velocidad debajo de la última moneda de cada racha, se anima a los jugadores a ceñirse a la pista para conseguir el tiempo de carrera más eficiente. Las monedas reaparecen en cada vuelta, para dar la oportunidad de recogerlas de nuevo si los jugadores las pierden la primera vez.
Diseño visual para mantener a los jugadores en la pista: se han utilizado barreras bajas y blancas en muchos lugares de la pista para enfatizar el flujo previsto de la misma. La pista se ha diseñado para que sea lo bastante ancha para unos cuantos coches uno al lado del otro. La decoración y los elementos adicionales, como árboles, RV y otros diseños, se han colocado de forma que el vehículo de un jugador pueda circular cómodamente sin quedarse atascado, pero que se le disuada de tomar caminos no deseados.
Atajos y saltos: el mapa original era una simple figura de 8, pero en las pruebas de juego descubrimos que a los jugadores les encantaba utilizar los saltos para tomar atajos. En el nuevo diseño, se han añadido algunos atajos y saltos para que los jugadores puedan elegir la forma en que quieren completar el mapa.
Al final, los puntos de control de la carrera, colocados de manera intencionada, son la forma definitiva de exigir a los jugadores que sigan la pista, ya que cada uno de ellos es necesario para avanzar en la carrera.