Le modèle Course sur piste avec persistance Verse est le modèle du mode Créatif Créer une course sur piste converti pour l'UEFN, dont les fonctionnalités suivantes ont été ajoutées au projet :
Un classement local persistant dans le salon d'avant-jeu utilisant la persistance Verse qui ne s'affiche qu'à la première manche.
Un système qui attribue des joueurs aux voitures sur la ligne de départ en fonction de leur ordre d'arrivée lors d'une manche précédente, en utilisant la persistance Verse.
Une grille de départ qui affiche les statistiques de chaque joueur à l'aide d'une cinématique et de Verse.
Et bien plus encore !
L'objectif du modèle du mode Créatif Créer une course sur piste était d'utiliser les ressources de piste de course pour créer un mode de course unique en son genre, avec certaines fonctionnalités ergonomiques. Ce modèle UEFN met en place une approche holistique pour remplacer et mettre à niveau de nombreuses fonctionnalités sur la carte, afin de profiter des puissantes capacités de l'UEFN.
Les sections suivantes vous présentent ces mises à jour plus en détail.
Mettre à niveau la zone de tutoriel
Le classement est disponible dans la zone de tutoriel. Chaque fois que vous chargez votre première manche sur la carte, vous disposez de 30 secondes pour consulter le classement actuel et explorer la zone de tutoriel.
Cette zone est conçue pour être visuellement attrayante pour les joueurs qui veulent s'amuser pendant la course, tout en fournissant des approfondissements sur la procédure de création d'une carte comme celle-ci. La zone de tutoriel a été repensée à partir du modèle de mode Créatif pour paraître plus claire et ouverte, et des lumières naturelles Lumen ont été ajoutées.
Lorsque vous chargez le modèle dans l'UEFN, vous pouvez découvrir la configuration de chaque groupe d'appareils et de scripts Verse pour savoir comment le modèle a été créé et les implémenter dans vos expériences.
La zone de tutoriel correspond à l'emplacement de la plupart de nos appareils et vous permet de les parcourir et de comprendre leur logique. Parmi eux figurent les appareils de rétention principale, de récompense et de données. Les appareils de récompense n'accordent de l'EXP que lorsque vous terminez un tour ou une course.
Vous pouvez configurer des appareils de données pour suivre différents points de données et améliorer votre projet lors de futures mises à jour. Ce modèle suit la fréquence à laquelle chaque point de passage est franchi et la fréquence à laquelle les joueurs ramassent des pièces d'argent pendant la course. Vous obtenez alors des données sur la facilité ou la difficulté d'atteindre un point de passage ou une pièce spécifique. Connaître ces données vous permet d'ajuster la position ou le nombre de ces objets dans les prochaines versions pour améliorer la fluidité du jeu et offrir une meilleure expérience de course.
Nettoyer l'organiseur
Après la conversion du projet en UEFN, l'organiseur était encombré d'une longue liste désordonnée de ressources.
Même si l'ensemble des fonctionnalités étaient toujours opérationnelles, les noms des véhicules, des barrières et d'autres éléments étaient numérotés, ce qui compliquait la compréhension de la structure du projet. Le processus de conversion a automatiquement ajouté ces numéros pour garantir que chaque ressource et appareil avait un nom propre.
Pour gérer cela, un système de fichiers a été ajouté au projet pour organiser tous les objets en fonction de leur emplacement et de leur fonctionnalité. Même si l'organisation peut être longue, ce système vous permet de déplacer ou de supprimer des groupes d'objets ou des zones complètes beaucoup plus efficacement que dans le mode Créatif.
Classement local persistant
En raison du manque de données persistantes dans la carte d'origine du mode Créatif, il n'était pas possible de suivre les vainqueurs des courses précédentes et les statistiques des joueurs. Dans la carte du modèle UEFN mise à jour, l'utilisation de Verse et de la persistance Verse nous permet de stocker les données des joueurs sur plusieurs sessions de jeu, pour surveiller leur historique de statistiques et créer des classements locaux. Vous ne pouvez accéder qu'aux données des joueurs présents dans la session en cours. Le classement ne reflétera donc que les statistiques des joueurs actuellement en compétition.
Nous avons décidé que les « podiums » et le « temps au tour » étaient les statistiques persistantes les plus importantes à suivre par joueur. Seuls les 3 meilleurs pilotes accèdent au podium, et le meilleur temps au tour donne une indication des coureurs les plus rapides. Nous avons également ajouté une statistique nommée "points". Les joueurs obtiennent des points en fonction de leur classement pendant la course. Ceux qui participent à de nombreuses courses, mais n'obtiennent pas forcément un bon classement peuvent donc tout de même gagner un grand nombre de points. Grâce à ces statistiques, nous avons trouvé un moyen de récompenser à la fois les coureurs les plus acharnés, les plus rapides et les plus assidus.
Le modèle converti utilise un salon d'avant-jeu avec des classements locaux qui présentent l'historique des statistiques de chaque joueur. Ces statistiques sont triées de manière à ce que les joueurs dont l'historique de statistiques est le meilleur apparaissent au premier plan, en mettant notamment en avant les trois meilleurs joueurs. Ces statistiques apparaissent également dans l'ATH pendant la cinématique de grille de départ, ce qui permet aux joueurs d'évaluer leurs adversaires et de se souvenir qui surveiller pendant la course.
Pour en savoir plus sur la création d'un classement local persistant, consultez la rubrique Créer votre propre classement dans le jeu.
Ordre des coureurs sur la ligne de départ
Le modèle converti remplace l'ordre aléatoire des coureurs sur la ligne de départ dans le projet d'origine, par un ordre basé sur les performances des coureurs à la manche précédente. Cela encourage les joueurs à terminer la course rapidement même s'ils ne sont pas dans les premiers.
Lors de la première manche, les coureurs sont placés dans un ordre aléatoire, mais pour les manches suivantes, les coureurs sont placés selon la position à laquelle ils ont terminé la manche précédente. Ces informations doivent être stockées entre les manches, mais ne persistent pas après la fin du jeu. Vous pouvez les utiliser pour déterminer l'ordre de départ en triant les joueurs en fonction de leur ordre d'arrivée précédent. Pour apprendre à stocker des informations sur les manches et à trier des données, consultez les tutoriels suivants :
# 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)
Lorsque vous attribuez des joueurs à des véhicules et que vous les installez sur la ligne de départ, il faut vous assurer qu'il s'agit bien des joueurs actifs et qui vont concourir. Vous pouvez créer une fonction nommée GetAllValidPlayers() qui traite tous les joueurs et renvoie ceux qui sont toujours actifs (qui n'ont pas encore quitté le jeu) et ne sont pas spectateurs (qui participeront réellement à la course).
# 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:
PlayerLe projet utilise l'appareil starting_game_sequence pour configurer le salon de classement lors de la première manche, puis assigner les joueurs aux positions de départ et aux véhicules avant le début de la course.
# 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 }
Cinématique de la ligne de départ avec les statistiques des joueurs
La version originale du modèle Créer une course sur piste du mode Créatif utilisait le déclencheur d'impulsions pour orchestrer l'introduction à vos marques-feu-partez de la course. Le déclencheur d'impulsions a joué une séquence d'événements sur une période définie en activant des déclencheurs pour afficher du texte et allumer des lumières sur la ligne de départ.
Avec le modèle converti, le déclencheur d'impulsions a été remplacé par l'appareil de séquence cinématique de l'UEFN pour obtenir une grande cinématique d'ouverture. Sequencer vous permet d'ajouter différentes caméras, des éléments d'affichage tête haute (ATH) et une vue dynamique de la grille de départ qui s'ajuste en fonction du nombre de joueurs actifs. De la même manière que le déclencheur d'impulsions, la séquence de niveau active les appareils à des moments importants, ce qui vous permet de déterminer quand afficher le score du joueur suivant ou quand couper l'intro.
Plus précisément, la séquence de niveau active le déclencheur StartPlayerIntroEvent chaque fois qu'une présentation de joueur démarre et active le déclencheur EndPlayerIntroEvent chaque fois qu'une présentation de joueur se termine. Le code Verse utilise ces informations pour déterminer combien de présentations de joueurs ont déjà été affichées et arrête de jouer la cinématique si ce nombre est identique au nombre de joueurs dans le jeu. Si la cinématique se termine en premier, elle annule également l'attente des présentations des joueurs, car elle se trouve dans l'expression race.
Le code Verse appelle WaitForPlayerIntro pour chaque joueur, ce qui lance une boucle pour chacun d'eux, et attend que le déclencheur StartPlayerIntroEvent s'active un nombre de fois correspondant à l'ordre de position de départ du joueur pour savoir quand afficher les statistiques du joueur dans l'ATH. Chacune de ces boucles WaitForPlayerIntro() est appelée dans la fonction ArraySync(), qui utilise un algorithme de concurrence de type diviser pour régner pour synchroniser plusieurs fonctions asynchrones et éléments de matrice.
# 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{}
Le projet utilise un appareil de fenêtre pop-up pour concevoir les widgets dans l'éditeur de widget et échanger les informations à l'aide de Verse. Il y parvient en définissant le texte sur des boutons de l'appareil de fenêtre 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]):
Conception de niveau
Dans cette mise à jour, nous avons utilisé le mode Paysage pour créer une piste tout-terrain. Nous avons économisé de la mémoire en utilisant moins de ressources, et les montagnes autour de la piste ont plus de profondeur. Nous avons également utilisé des volumes d'eau et une cascade pour créer un nouveau type de terrain et attirer l'attention sur la partie suivante de la piste de course.
Nous sommes passés de l'ancien cycle jour/nuit de notre projet d'origine à l'éclairage avancé du chapitre 4 de Fortnite. Ce nouveau cycle nous a permis d'utiliser le système Lumen, pour créer des ombres plus douces et une illumination globale réaliste.
Saviez-vous que le modèle de piste de course d'origine comptait plus de 120 barrières ? Des barrières étaient utilisées pour maintenir les joueurs sur la piste et pour garantir que les voitures ne sortent jamais des limites. Dans la version mise à jour, vous constaterez que les barrières ne sont utilisées que pour maintenir les joueurs à leur place avant le début d'une course et non tout autour de la piste. Des points de passage de course, des objets à ramasser et des éléments d'environnement ont été utilisés pour encourager les joueurs à rester sur la piste :
Pièces pour l'accélération : en ajoutant une dalle turbo sous la dernière pièce de chaque série, les joueurs sont encouragés à rester sur la piste pour obtenir le meilleur temps de course. Les pièces réapparaissent à chaque tour, ce qui donne une occasion de les récupérer si les joueurs les ratent la première fois.
Conception visuelle pour garder les joueurs sur la piste : des barrières basses blanches ont été utilisées à de nombreux endroits de la piste pour mettre en évidence le chemin de piste prévu. La largeur de la route a été conçue pour permettre à quelques voitures de circuler côte à côte. La décoration et les accessoires supplémentaires, tels que les arbres, les camping-cars et autres objets, ont été placés de manière à ce que le véhicule d'un joueur puisse passer confortablement sans se retrouver coincé, tout en le dissuadant d'emprunter des chemins non prévus.
Raccourcis et sauts : la carte d'origine était en forme de 8 simple, mais lors des tests de jeu, nous avons constaté que les joueurs adoraient utiliser les sauts pour prendre des raccourcis. Quelques raccourcis et sauts ont été ajoutés dans la nouvelle conception, pour permettre aux joueurs de choisir comment terminer la carte.
Les points de passage de course placés intentionnellement sont en fin de compte le meilleur moyen d'obliger les joueurs à suivre la piste, car ils sont tous nécessaires pour progresser dans la course.