Aller au contenu
Guide

Sauvegarder la progression d'un joueur sans perdre de données

Perdre la progression d'un joueur est la faute la moins pardonnée sur Roblox. Presque toutes les pertes viennent de trois erreurs, toutes évitables.

Écrire moins, mais au bon moment

Le DataStore accepte environ une opération toutes les six secondes par clé. Sauvegarder à chaque gain de pièce dépasse ce budget en quelques secondes et remplit une file d'attente dont les demandes finissent par être abandonnées.

Garde l'état en mémoire dans une table indexée par UserId. Écris toutes les 60 à 120 secondes, à la sortie du joueur, et dans BindToClose pour vider la file à l'arrêt du serveur.

UpdateAsync plutôt que lire puis écrire

Lire avec GetAsync puis écrire avec SetAsync laisse une fenêtre pendant laquelle une autre session peut écrire : la seconde écriture écrase la première. UpdateAsync fait les deux en une opération et évite ce cas.

Entoure chaque appel d'un pcall, avec trois tentatives espacées, et journalise l'échec. Un pcall qui avale l'erreur sans rien dire transforme une perte de données en mystère.

Les profils vieillissent

Un profil sauvegardé avant l'ajout d'une fonctionnalité ne contient pas ses champs. Le code qui les lit trouve nil et plante — c'est ce qui casse à chaque mise à jour.

À la lecture, complète le profil chargé à partir d'un profil modèle, et préfixe tes clés par une version pour pouvoir migrer proprement.

  • Des données simples uniquement : nombres, chaînes, booléens, tables. Jamais d'Instance, de Vector3 ni de CFrame.
  • Une clé versionnée, par exemple « v1_joueur_ ».
  • Un profil modèle qui complète les champs absents à chaque chargement.

Questions fréquentes

Pourquoi mon DataStore ne marche pas dans Studio ?

L'accès aux services API doit être activé dans les paramètres du jeu, et la place doit être publiée. Attention : Studio écrit alors le vrai DataStore, celui de tes joueurs.

Sauvegarder la progression d'un joueur sans perdre de données — Nemesis