← Retour LearnBloxLearnBlox

Sauvegarder les données d'un joueur

Guide débutant

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.

🎯 En résumé, en 30 secondes
  • Le service s'appelle 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.
  • Sauvegarde à la déconnexion du joueur (PlayerRemoving), jamais en boucle rapide : Roblox limite à ~60 écritures par minute et par clé.
1️⃣ Activer le DataStore dans Studio

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.

💡 Cette option n'est nécessaire que dans l'éditeur Studio. Une fois le jeu publié, le DataStore fonctionne sans elle.
2️⃣ Créer ta base de sauvegarde
-- 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
end
3️⃣ Sauvegarder (SetAsync)
local 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
end
⚠️ Sans pcall, une simple coupure réseau côté Roblox fait planter tout ton script serveur — pas seulement la sauvegarde.
4️⃣ Charger au retour du joueur
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)
5️⃣ Ne jamais oublier de sauvegarder au départ
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)
❌ Les 3 erreurs qui font perdre des données
  • Oublier 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.
  • Sauvegarder en boucle rapide (à chaque frame, à chaque clic) : Roblox bloque au-delà de la limite de fréquence, et les sauvegardes suivantes échouent silencieusement.
  • Stocker une Instance (une Part, un joueur) au lieu d'une donnée simple : le DataStore n'accepte que du texte, des nombres, des booléens et des tables — jamais un objet du jeu.

Va plus loin : le module complet

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.

Voir le module gratuitement →