Ton joueur gagne 500 pièces, monte au niveau 3, débloque une épée légendaire — et perd tout en quittant la partie. C'est le problème numéro un que rencontre tout débutant sur Roblox : sans système de sauvegarde, rien ne persiste entre deux sessions.
La solution officielle s'appelle DataStoreService. Ce guide te montre exactement quoi écrire, où le placer, et les trois erreurs qui font perdre les données de la moitié des jeux débutants.
DataStoreService, accessible uniquement côté serveur (dans un Script, jamais un LocalScript).SetAsync écrit, GetAsync lit. Les deux peuvent échouer (coupure réseau) — on les protège toujours avec pcall.PlayerRemoving), jamais en boucle rapide : Roblox limite à ~60 écritures par minute et par clé.Avant d'écrire une ligne de code, une option est à cocher : Game Settings → Security → Enable Studio Access to API Services. Sans elle, GetAsync renverra toujours nil pendant tes tests, même si ton code est correct.
-- Dans un Script, à l'intérieur de ServerScriptService
local DataStoreService = game:GetService("DataStoreService")
local playerData = DataStoreService:GetDataStore("PlayerData")
-- Une clé unique par joueur : son UserId ne change jamais
local function getCle(joueur)
return "joueur_" .. joueur.UserId
endlocal function sauvegarder(joueur, donnees)
local ok, erreur = pcall(function()
playerData:SetAsync(getCle(joueur), donnees)
end)
if not ok then
warn("Échec sauvegarde pour " .. joueur.Name .. " : " .. erreur)
end
endpcall, une simple coupure réseau côté Roblox fait planter tout ton script serveur — pas seulement la sauvegarde.local Players = game:GetService("Players")
Players.PlayerAdded:Connect(function(joueur)
local ok, donnees = pcall(function()
return playerData:GetAsync(getCle(joueur))
end)
if ok and donnees then
-- Joueur déjà connu : on restaure ses données
print(joueur.Name .. " a " .. donnees.argent .. " pièces")
else
-- Nouveau joueur : valeurs de départ
donnees = { argent = 0, niveau = 1 }
end
end)Players.PlayerRemoving:Connect(function(joueur)
local donnees = obtenirDonneesActuelles(joueur) -- ta propre fonction
sauvegarder(joueur, donnees)
end)
-- Filet de sécurité : sauvegarde tout le monde si le serveur s'arrête
game:BindToClose(function()
for _, joueur in Players:GetPlayers() do
sauvegarder(joueur, obtenirDonneesActuelles(joueur))
end
end)PlayerRemoving : si le joueur quitte sans que le serveur ait le temps de sauvegarder, tout est perdu. C'est l'erreur la plus fréquente.Ce guide couvre l'essentiel pour démarrer. Le module DataStore : Sauvegarder les données approfondit la gestion des conflits entre serveurs (UpdateAsync), les sessions de données et les exercices pratiques corrigés.