Les jeux ont souvent besoin de stocker des données persistantes entre les sessions, comme le niveau d'un joueur, les points d'expérience, l'argent, les articles d'inventaire, la localisation et plus.
Ce tutoriel montre comment créer un magasin de données de base , enregistrer les données du joueur et lire les données de retour dans une session de jeu.
Activer l'accès à Studio
Par défaut, les jeux testés dans Studio ne peuvent pas accéder aux magasins de données, vous devez donc les activer en premier :
Publiez l'expérience.
Choisissez Fichier et Options de jeu .
Dans la section Sécurité , activez Activer l'accès du studio aux services API et cliquez sur Enregistrer .
Créer un magasin de données
Les magasins de données requièrent un nom unique nom .Cet exemple crée un magasin de données nommé PlayerGold qui enregistre l'or de chaque joueur dans un stockage permanent :
Créez un Script dans ServerScriptService appelé GoldManager .
Les magasins de données sont gérés par DataStoreService, obtenez donc le service :
local DataStoreService = game:GetService("DataStoreService")Appellez DataStoreService:GetDataStore() avec la chaîne "PlayerGold".Cette méthode accède au magasin de données PlayerGold s'il existe déjà.S'il n'existe pas, la méthode crée un nouveau magasin de données et le nomme PlayerGold .
local DataStoreService = game:GetService("DataStoreService")local goldStore = DataStoreService:GetDataStore("PlayerGold")
Enregistrer les données
Un stock de données est essentiellement un dictionnaire, comme une table Luau.Chaque valeur dans le magasin de données est indexée par une clé unique , qui pourrait être la clé unique du joueur ou simplement une chaîne nommée pour une promotion de jeu.
Key | Value |
---|---|
31250608 | 50 |
351675979 | 20 |
505306092 | 78000 |
Pour sauvegarder les données du joueur dans le magasin de données :
Créez une variable nommée playerUserID pour la clé du magasin de données. Puis, utilisez playerGold pour stocker la quantité d'or de départ d'un joueur.
local DataStoreService = game:GetService("DataStoreService")local goldStore = DataStoreService:GetDataStore("PlayerGold")-- Clé et valeur de la base de donnéeslocal playerUserID = 505306092local playerGold = 250Pour enregistrer des données dans le PlayerGold magasin de données, appelez SetAsync dans un appel protégé, en passant les variables clé et valeur précédemment créées.
local DataStoreService = game:GetService("DataStoreService")local goldStore = DataStoreService:GetDataStore("PlayerGold")-- Clé et valeur de la base de donnéeslocal playerUserID = 505306092local playerGold = 250-- Définir la clé du stock de donnéeslocal success, error = pcall(function()goldStore:SetAsync(playerUserID, playerGold)end)if not success thenwarn(error)end
Les fonctions comme SetAsync() sont des appels réseau qui peuvent parfois échouer.Comme illustré ci-dessus, pcall() est utilisé pour détecter et gérer lorsque de tels échecs se produisent.
Dans sa forme la plus basique, pcall() accepte une fonction et renvoie deux valeurs :
- L'état, qui est true si la fonction est exécutée sans erreurs, ou false autrement.
- La valeur de retour de la fonction ou un message d'erreur.
L'échantillon ci-dessus vérifie le statut à la ligne 13. Si SetAsync() échoue pour quelque raison que ce soit, l'échantillon affiche l'erreur dans la fenêtre Sortie.
Lire des données
Pour lire des données d'un magasin de données, appelez GetAsync() avec le nom de clé souhaité.
local DataStoreService = game:GetService("DataStoreService")
local goldStore = DataStoreService:GetDataStore("PlayerGold")
-- Clé et valeur de la base de données
local playerUserID = 505306092
local playerGold = 250
-- Définir la clé du stock de données
local setSuccess, errorMessage = pcall(function()
goldStore:SetAsync(playerUserID, playerGold)
end)
if not setSuccess then
warn(errorMessage)
end
-- Lire la clé du stock de données
local getSuccess, currentGold = pcall(function()
return goldStore:GetAsync(playerUserID)
end)
if getSuccess then
print(currentGold)
end
Pour tester le script, cliquez sur Exécuter et remarquez la valeur currentGold imprimée dans la fenêtre sortie .Remarquez que cela peut prendre quelques secondes, car les fonctions doivent se connecter aux serveurs de stockage de données
Lire et sauvegarder automatiquement
Le script précédent fonctionne, mais a un problème fondamental : il inclut des valeurs codées en dur pour playerUserID et playerGold, donc il ne prend pas en charge plusieurs joueurs avec différentes quantités d'or.Une solution plus réaliste lit la valeur de l'or lorsque le joueur se connecte à l'expérience et la sauvegarde ensuite lorsque le joueur quitte.Cette approche consiste à connecter les appels du magasin de données à événements du service Players.
local DataStoreService = game:GetService("DataStoreService")
local Players = game:GetService("Players")
local goldStore = DataStoreService:GetDataStore("PlayerGold")
-- Ajouter des valeurs d'or pour chaque joueur à une table locale pour éviter de toucher les données
-- stocker à plusieurs reprises.
local playerGold = {}
local function incrementGold(player, amount)
playerGold[player.UserId] += amount
end
local function onPlayerAdded(player)
-- Lire la clé du stock de données
local success, storedGold = pcall(function()
return goldStore:GetAsync(player.UserId)
end)
if success then
local currentGold
if storedGold then
currentGold = storedGold
else
currentGold = 0
end
playerGold[player.UserId] = currentGold
print(currentGold)
end
-- Test d'augmentation d'or
incrementGold(player, 5)
end
local function onPlayerRemoving(player)
-- Définir la clé du stock de données
local success, err = pcall(function()
goldStore:SetAsync(player.UserId, playerGold[player.UserId])
end)
if not success then
warn(err)
end
-- Nettoyez l'entrée pour que la table ne croisse pas pendant la durée de vie du serveur
playerGold[player.UserId] = nil
end
Players.PlayerAdded:Connect(onPlayerAdded)
Players.PlayerRemoving:Connect(onPlayerRemoving)
Lire et sauvegarder la position du personnage
Pour enregistrer la position du joueur, vous travaillez avec le Character plutôt que le Player, mais le principe est similaire.Cette fois, créez un Script dans ServerScriptService appelé PositionManager :
local Players = game:GetService("Players")
local DataStoreService = game:GetService("DataStoreService")
local Workspace = game:GetService("Workspace")
local playerPositionStore = DataStoreService:GetDataStore("PlayerPositionStore")
local function positionHandler(player)
-- Chargement de la position sur ajout de caractère
player.CharacterAdded:Connect(function(character)
local success, coords = pcall(function()
return playerPositionStore:GetAsync(player.UserId)
end)
local position = Vector3.new(coords[1], coords[2], coords[3])
if success and position then
character:PivotTo(CFrame.new(position))
print("Loaded player position!")
else
warn("Failed to load position for player " .. player.Name .. ". Placing in default position.")
end
-- Gérer la réapparition du joueur après la mort
local humanoid = character:FindFirstChildOfClass("Humanoid")
humanoid.Died:Connect(function()
local spawnLocation = Workspace:FindFirstChild("SpawnLocation")
character:PivotTo(spawnLocation.CFrame)
end)
end)
-- Enregistrer la position sur l'élimination du personnage
player.CharacterRemoving:Connect(function(character)
local position = character:GetPivot().Position
local success, err = pcall(function()
playerPositionStore:SetAsync(player.UserId, {position.X, position.Y, position.Z})
print("Saved player position!")
end)
if not success then
warn("Failed to save position for player " .. player.Name .. ": " .. err)
end
end)
end
Players.PlayerAdded:Connect(positionHandler)
Ce script ajoute un nouveau magasin de données, playerPositionStore.Comme les magasins de données ne stockent que des types de base plutôt que des objets, vous devez stocker les coordonnées X, Y et Z en tant que nombres individuels plutôt qu'une seule valeur Vector3 ou CFrame.Pendant que vous testez votre expérience, déplacez votre personnage.Remarquez comment votre personnage revient à la même position la prochaine fois que vous testez votre expérience.
Projet d'exemple
Maintenant que vous comprenez l'utilisation de la base de données de base, testez-la dans le jeu d'échantillon Gold Rush.Vous pouvez également modifier le jeu dans Studio et explorer le script amélioré GoldManager , qui affiche l'or comme partie de l'interface utilisateur et inclut la sauvegarde automatique.