Maintenant que vous pouvez détecter quand un joueur a collecté une pièce, cette section du tutoriel vous apprend à compter le nombre de pièces que les joueurs ont collectées et à rendre ce montant visible sur un tableau de bord.
Créer un script de module pour enregistrer la collectionsde pièces
Pour gérer le stockage et la gestion des données de collection de pièces de chaque joueur, vous devez créer un objet ModuleScript pour contenir une structure de données et des fonctions qui accèdent aux données de collection de pièces pour chaque joueur.Les scripts de module sont du code réutilisable que d'autres scripts peuvent exiger.Dans ce cas, le CoinService nécessite ce script de module pour qu'il puisse mettre à jour les données de collection de pièces lorsque les joueurs touchent des pièces.
Pour créer un script de module :
Dans la fenêtre Explorateur , passez la souris sur Stockage du serveur et cliquez sur le bouton ⊕ . Un menu contextuel s'affiche.
Dans le menu contextuel, sélectionnez ModuleScript .Un nouveau script de module s'affiche sous ServerStorage .Vous placez un script de module dans ServerStorage parce que vous voulez gérer la logique de la collection de pièces sur le serveur.
Renommez le script du module en PlayerData .
Remplacez le code par défaut par le code suivant :
local PlayerData = {}PlayerData.COIN_KEY_NAME = "Coins"local playerData = {--[[[userId: string] = {["Coins"] = coinAmount: number}]]}local DEFAULT_PLAYER_DATA = {[PlayerData.COIN_KEY_NAME] = 0}local function getData(player)local data = playerData[tostring(player.UserId)] or DEFAULT_PLAYER_DATAplayerData[tostring(player.UserId)] = datareturn dataendfunction PlayerData.getValue(player, key)return getData(player)[key]endfunction PlayerData.updateValue(player, key, updateFunction)local data = getData(player)local oldValue = data[key]local newValue = updateFunction(oldValue)data[key] = newValuereturn newValueendreturn PlayerDataExplication du codeLe script de module définit une table PlayerData contenant zéro ou plusieurs tables playerData qui représentent les données de collection de pièces pour un joueur.Chaque script qui nécessite ce script de module reçoit la même copie de la table PlayerData, ce qui permet à plusieurs scripts de modifier et de partager les données de collection de pièces.
Déclarer les structures de données
Le script du module commence par une déclaration d'une table vide, PlayerData, qui est renvoyée à la fin du script.Il contient également des méthodes d'accès pour obtenir et définir des valeurs dans la table.
La table playerData contient des commentaires qui décrivent la structure de la table, ce qui facilite la compréhension du code.Dans ce cas, une table playerData contient un userId et un champ correspondant nommé Coins qui représente le montant des pièces collectées pour ce joueur.
local PlayerData = {}PlayerData.COIN_KEY_NAME = "Coins"local playerData = {--[[[userId: string] = {["Coins"] = coinAmount: number}]]}...return PlayerDataDéfinir un accesseur de données local
getData() est une fonction locale qui récupère des données pour une table spécifique playerData.Si un joueur n'a pas collecté une pièce, il renvoie une table DEFAULT_PLAYER_DATA pour s'assurer que chaque joueur a des données associées à eux.Une convention commune consiste à créer des fonctions simples et visibles du public qui déchargent la logique vers des fonctions localement scopées qui font le travail lourd.
local DEFAULT_PLAYER_DATA = {[PlayerData.COIN_KEY_NAME] = 0}local function getData(player)local data = playerData[tostring(player.UserId)] or DEFAULT_PLAYER_DATAplayerData[tostring(player.UserId)] = datareturn dataendDéfinir les accesseurs de données publiques
getValue() et updateValue() sont des fonctions publiques que d'autres scripts qui nécessitent ce script de module peuvent appeler.Dans notre cas, le CoinService utilise ces fonctions pour mettre à jour les données de collection de pièces d'un joueur chaque fois que ce joueur touche une pièce.
function PlayerData.getValue(player, key)return getData(player)[key]endfunction PlayerData.updateValue(player, key, updateFunction)local data = getData(player)local oldValue = data[key]local newValue = updateFunction(oldValue)data[key] = newValuereturn newValueend
Implémenter un classements
Vous pouvez représenter les données de collection de pièces visuellement avec un classementssur écran.Roblox inclut un système intégré qui génère automatiquement un classement en utilisant une interface utilisateur par défaut.
Pour créer le classements:
Dans la fenêtre Explorateur , créez un ModuleScript dans Stockage du serveur , puis renommez le script de module en Classement .
Remplacez le code par défaut par le code suivant :
local Leaderboard = {}-- Créer un nouveau classementslocal function setupLeaderboard(player)local leaderstats = Instance.new("Folder")-- « leaderstats » est un nom réservé que Roblox reconnaît pour créer un classementsleaderstats.Name = "leaderstats"leaderstats.Parent = playerreturn leaderstatsend-- Création d'une nouvelle valeur de statistic de classementlocal function setupStat(leaderstats, statName)local stat = Instance.new("IntValue")stat.Name = statNamestat.Value = 0stat.Parent = leaderstatsreturn statend-- Mise à jour de la valeur de stat d'un joueurfunction Leaderboard.setStat(player, statName, value)local leaderstats = player:FindFirstChild("leaderstats")if not leaderstats thenleaderstats = setupLeaderboard(player)endlocal stat = leaderstats:FindFirstChild(statName)if not stat thenstat = setupStat(leaderstats, statName)endstat.Value = valueendreturn LeaderboardExplication du codeLes sections suivantes décrivent comment le classement fonctionne plus en détail.
Créer un classement
La fonction setupLeaderboard() crée une nouvelle instance de dossier nommée leaderstats et la définit comme enfant du joueur spécifié.Roblox reconnaît automatiquement un dossier nommé leaderstats comme conteneur de statistiques et crée un élément d'interface utilisateur pour afficher les statistiques.Il nécessite que les valeurs dans leaderstats soient stockées en tant qu'objets de valeur (comme StringValue , IntValue ou NumberValue ).
-- Créer un nouveau classementslocal function setupLeaderboard(player)local leaderstats = Instance.new("Folder")-- « leaderstats » est un nom réservé que Roblox reconnaît pour créer un classementsleaderstats.Name = "leaderstats"leaderstats.Parent = playerreturn leaderstatsend-- Création d'une nouvelle valeur de statistic de classementlocal function setupStat(leaderstats, statName)local stat = Instance.new("IntValue")stat.Name = statNamestat.Value = 0stat.Parent = leaderstatsreturn statendMise à jour des statistiques du joueur
setStat() est la seule fonction publique dans le module Classement .Il crée des valeurs de stat pour un joueur spécifié ou la liste des scores elle-même si elle n'existe pas déjà.
FindFirstChild() prend le nom d'un objet et retourne l'objet s'il existe, ou nil s'il n'existe pas.C'est une méthode commune et sûre de vérifier si un objet existe avant de l'utiliser.
-- Mise à jour de la valeur de stat d'un joueurfunction Leaderboard.setStat(player, statName, value)local leaderstats = player:FindFirstChild("leaderstats")if not leaderstats thenleaderstats = setupLeaderboard(player)endlocal stat = leaderstats:FindFirstChild(statName)if not stat thenstat = setupStat(leaderstats, statName)endstat.Value = valueend
Intégrer les scripts de module
Avec les scripts de module JoueurData et Classement complets, exigez-les dans le script CoinService pour gérer et afficher les données de pièces du joueur.Pour mettre à jour CoinService :
Dans la fenêtre Explorateur , ouvrez le script CoinService .
Remplacez le code existant par le code suivant :
-- Initialisation des services et des variableslocal Workspace = game:GetService("Workspace")local Players = game:GetService("Players")local ServerStorage = game:GetService("ServerStorage")-- Moduleurslocal Leaderboard = require(ServerStorage.Leaderboard)local PlayerData = require(ServerStorage.PlayerData)local coinsFolder = Workspace.World.Coinslocal coins = coinsFolder:GetChildren()local COIN_KEY_NAME = PlayerData.COIN_KEY_NAMElocal COOLDOWN = 10local COIN_AMOUNT_TO_ADD = 1local function updatePlayerCoins(player, updateFunction)-- Mise à jour de la table de pièceslocal newCoinAmount = PlayerData.updateValue(player, COIN_KEY_NAME, updateFunction)-- Mise à jour du classement des leaders de piècesLeaderboard.setStat(player, COIN_KEY_NAME, newCoinAmount)end-- Définir le gestionnaire d'événementlocal function onCoinTouched(otherPart, coin)if coin:GetAttribute("Enabled") thenlocal character = otherPart.Parentlocal player = Players:GetPlayerFromCharacter(character)if player then-- Le joueur a touché une piècecoin.Transparency = 1coin:SetAttribute("Enabled", false)updatePlayerCoins(player, function(oldCoinAmount)oldCoinAmount = oldCoinAmount or 0return oldCoinAmount + COIN_AMOUNT_TO_ADDend)task.wait(COOLDOWN)coin.Transparency = 0coin:SetAttribute("Enabled", true)endendend-- Configurer les écouteurs d'événementfor _, coin in coins docoin:SetAttribute("Enabled", true)coin.Touched:Connect(function(otherPart)onCoinTouched(otherPart, coin)end)endExplication du codeLes modifications du script original CoinService incluent :
- Importer les modules Données du joueur et Classement avec la fonction .
- Déclaration de COIN_AMOUNT_TO_ADD comme le nombre de pièces à ajouter lorsqu'un joueur collecte une pièce, et COIN_KEY_NAME comme le nom de clé défini dans PlayerData .
- Création de la fonction d'aide updatePlayerCoins() pour mettre à jour le nombre de pièces du joueur et la statistique de classement associée.
- Remplacement de la déclaration de remplacement du placeholder par un appel à .
Test de jeu
Il est temps de voir si la collection de pièces fonctionne comme prévu.Lorsque vous touchez et collectez une pièce dans le jeu, vous devriez être en mesure de voir le montant de pièces que vous avez collectées sur l'interface utilisateur du classement.Pour tester votre expérience :
Dans la barre d'outils, cliquez sur le bouton Jouer . Studio entre en mode de test de jeu.
Déplacez votre personnage pour toucher une pièce.Si vos scripts fonctionnent correctement, l'interface utilisateur de la liste des leaders s'affiche et augmente le nombre de pièces que vous collectez lorsque vous en collectez plus.