Module 06 · Leçon 4 sur 5
Donner envie de revenir
Identifie les leviers de rejouabilité (variété, objectifs quotidiens, social, collections, contenu renouvelé, notifications) et utilise-les sans manipuler tes joueurs.
- ⏱️ 30 min
- 📝 Quiz de 6 questions
- 🔄 Vérifié le 24 octobre 2026
Sur cette page
- Ce que dit Roblox sur la rétention à long terme
- Levier 1 : la variété
- Levier 2 : des objectifs quotidiens simples
- Levier 3 : jouer avec ses amis
- Levier 4 : les collections et les badges
- Levier 5 : du contenu renouvelé
- Levier 6 : les notifications d’expérience
- Respecter le temps du joueur : les dark patterns
- Quiz de fin de leçon
🎯 Dans cette leçon, tu vas apprendre à…
- Identifier les leviers de rejouabilité recommandés par Roblox
- Ajouter des objectifs quotidiens simples et respectueux du temps du joueur
- Utiliser le social, les badges et les notifications d’expérience à bon escient
- Reconnaître et refuser les « dark patterns » interdits ou nuisibles
Ton obby est amusant la première fois. Mais un joueur qui l’a terminé a-t-il une raison d’y revenir demain ? Sur Roblox, cette question est centrale : la page officielle « Design for Roblox » distingue les touristes, qui passent d’un jeu à l’autre en privilégiant la variété, et les habitués (locals), qui se concentrent sur un petit nombre de jeux et forment presque toute la base de joueurs engagés d’un jeu. Cette leçon passe en revue les leviers qui transforment un touriste en habitué, et ceux qu’il ne faut jamais utiliser.
Ce que dit Roblox sur la rétention à long terme
La page Retention du Creator Hub associe chaque horizon de rétention à une partie du jeu :
- D1 (le lendemain) : la core loop, le début de partie et les performances (leçons 1 et 2) ;
- D7 (une semaine plus tard) : le système de progression, avec des objectifs clairs à court et long terme, de la variété de contenu et une difficulté équilibrée (leçon 3) ;
- D30 (un mois plus tard) : ce que les joueurs peuvent faire après les objectifs principaux, avec du contenu ajouté régulièrement et des mécaniques sociales (la page cite les échanges, les groupes, les guildes et les systèmes compétitifs).
Les définitions précises de ces indicateurs et leur lecture dans le Creator Dashboard sont au programme du module 9 (La rétention : D1, D7, D30). Ici, on s’intéresse aux leviers de conception.
Levier 1 : la variété
Un parcours identique à chaque visite s’épuise vite. Quelques idées adaptées à un obby :
- un mode chrono pour ceux qui ont fini le parcours ;
- des pièces dorées cachées dans des recoins à explorer ;
- un parcours bonus qui change selon le jour ou la semaine.
Ces idées sont des exemples de la formation. La documentation Roblox sur les quêtes note de son côté que des quêtes peuvent pousser les joueurs à essayer des contenus ou des systèmes qu’ils auraient ignorés, ce qui est particulièrement utile dans les jeux au gameplay répétitif.
Levier 2 : des objectifs quotidiens simples
La documentation Roblox décrit les quotidiennes (dailies) comme des tâches courtes, aux objectifs simples et peu exigeants, avec des récompenses modestes, à accomplir dans les 24 heures. Elle recommande de les réserver aux objectifs à court terme, réalisables en une session. Ce sont aussi, selon la même page, un bon moyen de distribuer régulièrement de petites quantités de monnaie.
Voici un objectif quotidien pour l’Obby des Nuages : « Ramasse 20 pièces aujourd’hui » (bonus : 15 pièces). Crée un ModuleScript ObjectifsQuotidiens dans ServerScriptService avec le code ci-dessous. Ce module ne fait aucun appel au DataStore : il lit et modifie la table de données du joueur que ton module DonneesJoueurs (module 5) garde déjà en mémoire et enregistre en entier à chaque sauvegarde. Dans ton projet Rojo, c’est le fichier src/ServerScriptService/ObjectifsQuotidiens.luau ; l’encadré « Avec Claude Code » plus bas te donne le prompt pour le faire écrire et brancher, à condition de relire le résultat avec ce qui suit.
-- ModuleScript « ObjectifsQuotidiens » dans ServerScriptService
-- Objectif quotidien : ramasser un certain nombre de pièces dans la journée (UTC).
-- Ne fait aucun appel DataStore : on travaille sur la table de données du joueur
-- que DonneesJoueurs (module 5) charge et sauvegarde déjà.
local ObjectifsQuotidiens = {}
ObjectifsQuotidiens.PIECES_A_RAMASSER = 20
ObjectifsQuotidiens.BONUS = 15
local SECONDES_PAR_JOUR = 86400
-- Numéro du jour en temps universel : change à minuit UTC, pareil pour tous les serveurs
local function jourActuel(): number
return math.floor(os.time() / SECONDES_PAR_JOUR)
end
-- Nouveau jour : on repart de zéro, sans rien retirer au joueur
local function mettreAJour(donnees)
local aujourdhui = jourActuel()
if donnees.jourObjectif ~= aujourdhui then
donnees.jourObjectif = aujourdhui
donnees.piecesDuJour = 0
donnees.bonusReclame = false
end
end
-- À appeler côté serveur chaque fois qu'une pièce ramassée est validée (module 4).
-- Renvoie le bonus à verser (0 la plupart du temps).
function ObjectifsQuotidiens.enregistrerPiece(donnees): number
mettreAJour(donnees)
donnees.piecesDuJour += 1
if donnees.piecesDuJour >= ObjectifsQuotidiens.PIECES_A_RAMASSER and not donnees.bonusReclame then
donnees.bonusReclame = true
return ObjectifsQuotidiens.BONUS
end
return 0
end
-- Pour l'interface : renvoie la progression du jour, par exemple 12 et 20
function ObjectifsQuotidiens.progression(donnees): (number, number)
mettreAJour(donnees)
local objectif = ObjectifsQuotidiens.PIECES_A_RAMASSER
return math.min(donnees.piecesDuJour, objectif), objectif
end
return ObjectifsQuotidiens
Les champs jourObjectif, piecesDuJour et bonusReclame n’existent pas dans les anciennes sauvegardes : ce n’est pas grave, mettreAJour les crée au premier appel (un champ absent vaut nil, donc différent du jour actuel).
Reste à le brancher dans ton Script serveur « Pieces » (module 4, leçon 5) :
- colle le bloc ci-dessous en haut du script, sous les
requireexistants et au-dessus de la fonctionpreparerPiece(une fonction locale doit être définie avant le code qui l’utilise) ; - dans
preparerPiece, juste après la ligne qui ajoute la pièce (pieces.Value += VALEUR_PIECE), ajoute l’appelverifierObjectifDuJour(player, pieces).
-- À ajouter dans ton Script serveur « Pieces » (ServerScriptService, module 4)
local ServerScriptService = game:GetService("ServerScriptService") -- déjà présent ? ne le répète pas
local DonneesJoueurs = require(ServerScriptService:WaitForChild("DonneesJoueurs"))
local ObjectifsQuotidiens = require(ServerScriptService:WaitForChild("ObjectifsQuotidiens"))
-- Ajoute le bonus du jour si l'objectif vient d'être atteint.
-- « pieces » est l'IntValue leaderstats.Pieces du joueur.
local function verifierObjectifDuJour(player: Player, pieces: IntValue)
local donnees = DonneesJoueurs.Obtenir(player) -- table en mémoire (module 5)
if donnees == nil then
return -- données pas encore chargées : on ne compte rien
end
local bonus = ObjectifsQuotidiens.enregistrerPiece(donnees)
if bonus > 0 then
pieces.Value += bonus
end
end
Remarque les choix de conception, aussi importants que le code :
- Le jour est calculé en UTC : tous les serveurs sont d’accord, et changer l’heure de son appareil ne sert à rien puisque tout se passe sur le serveur.
- Rien n’est perdu si le joueur manque un jour. L’objectif repart simplement de zéro.
- L’objectif tient dans une session et rapporte un bonus modeste, comme le recommande Roblox.
Levier 3 : jouer avec ses amis
Roblox insiste beaucoup sur ce point. La page « Design for Roblox » rappelle que de nombreux utilisateurs voient Roblox comme un endroit pour passer du temps avec leurs amis, que les invitations entre amis aident à faire grandir l’audience et que les jeux solo ont souvent plus de mal à construire et retenir une audience sur la plateforme.
Pour un obby, quelques pistes simples :
- un bouton « Inviter un ami » : Roblox fournit une invite officielle via
SocialService:PromptGameInvite(), à précéder d’une vérification avecSocialService:CanSendGameInviteAsync()(dans unpcall) ; - un classement de la meilleure étape ou du meilleur temps (les leaderstats du module 5 forment déjà un classement par serveur) ;
- des passages à deux, où un joueur active un pont pour l’autre.
La même page conseille de ne pas rendre les serveurs privés trop chers, car cela peut décourager des groupes d’amis de jouer ensemble.
Levier 4 : les collections et les badges
Collectionner donne un objectif à long terme. Les traînées de la boutique en sont déjà une ; les badges en sont une autre. Un badge est une récompense Roblox attribuée quand un joueur atteint un objectif dans ton jeu (« Sommet atteint », « Toutes les pièces dorées trouvées »).
- Ils se créent depuis le Creator Dashboard. Au moment de la rédaction (octobre 2026), la documentation indique que tu peux en créer 5 gratuitement par période de 24 heures (GMT) et par jeu, puis 100 Robux par badge supplémentaire dans cette période. Vérifie la page officielle avant de compter dessus.
- Ils s’attribuent depuis un Script serveur avec
BadgeService:AwardBadgeAsync()dans unpcall(l’ancienne méthodeAwardBadgeest dépréciée).
Levier 5 : du contenu renouvelé
Roblox appelle LiveOps (opérations en direct) tout le suivi d’un jeu après son lancement, et prévient que sans mises à jour, même les joueurs fidèles finissent par perdre intérêt. Sa documentation sur les mises à jour de contenu indique que beaucoup de jeux publient de petites nouveautés toutes les deux semaines à un mois, selon les capacités et la disponibilité des développeurs ; la page Retention évoque, elle, de petites mises à jour toutes les 2 à 4 semaines et de plus grosses tous les 2 à 3 mois. Pour un obby : une nouvelle zone, une traînée de saison, un parcours d’Halloween à durée limitée.
Deux conseils officiels à garder en tête :
- construire les nouveautés sur les systèmes existants (ajouter une zone, pas réinventer le jeu) ;
- être réaliste sur ce que l’équipe peut produire.
Notre conseil, pour un créateur seul : mieux vaut un rythme mensuel tenu dans la durée qu’un rythme hebdomadaire abandonné au bout d’un mois.
La préparation et l’annonce des mises à jour et des événements sont détaillées au module 8 (Mises à jour et événements).
Levier 6 : les notifications d’expérience
Roblox permet d’envoyer des notifications d’expérience personnalisées aux joueurs qui les ont acceptées. Voici ce que dit la documentation officielle au moment de la rédaction (octobre 2026) :
- seuls les utilisateurs de 13 ans et plus qui ont donné leur accord reçoivent ces notifications personnalisées ; les moins de 13 ans ne peuvent recevoir que les notifications de mises à jour d’expérience ;
- le jeu doit avoir au moins 100 visites depuis son lancement et ne pas être sous modération, et tu dois avoir la permission de gérer le jeu ;
- chaque utilisateur peut recevoir au maximum une notification par jour d’une même expérience (une limite quotidienne globale, toutes expériences confondues, s’applique aussi) ;
- la demande d’autorisation (opt-in) a un texte standard non modifiable. Elle ne s’affiche pas si l’utilisateur a déjà activé les notifications ou s’il a déjà vu la demande pour ton jeu dans les 30 derniers jours.
La documentation conseille de demander l’autorisation dans un contexte qui justifie une future notification : par exemple quand le joueur vient de terminer le parcours, pour être prévenu de la prochaine zone. Ce LocalScript reprend le modèle officiel (vérification avec CanPromptOptInAsync, puis PromptOptIn, chacun dans un pcall) :
-- LocalScript « ProposerNotifications » à placer dans StarterPlayer > StarterPlayerScripts
-- Propose d'activer les notifications une fois le parcours terminé.
local Players = game:GetService("Players")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local ExperienceNotificationService = game:GetService("ExperienceNotificationService")
local Config = require(ReplicatedStorage:WaitForChild("Modules"):WaitForChild("Config"))
-- Dernière étape du parcours : etapeFin du dernier niveau de Config.Niveaux (module 3, leçon 6)
local DERNIERE_ETAPE = Config.Niveaux[#Config.Niveaux].etapeFin
local joueur = Players.LocalPlayer
local etape = joueur:WaitForChild("leaderstats"):WaitForChild("Etape") :: IntValue
local dejaPropose = false
-- Vérifie si Roblox autorise à afficher la demande (âge, déjà accepté, déjà vue récemment…)
local function peutProposer(): boolean
local ok, resultat = pcall(function()
return ExperienceNotificationService:CanPromptOptInAsync()
end)
return ok and resultat == true
end
etape.Changed:Connect(function(nouvelleEtape: number)
if nouvelleEtape < DERNIERE_ETAPE or dejaPropose then
return
end
dejaPropose = true
task.wait(3) -- on laisse d'abord le joueur savourer sa victoire
if peutProposer() then
pcall(function()
ExperienceNotificationService:PromptOptIn()
end)
end
end)
Le module 5 crée Etape directement avec la valeur chargée : Changed ne se déclenche donc pas au chargement de la sauvegarde, et la proposition n’apparaît qu’au moment où le joueur atteint la dernière étape. De toute façon, Roblox ne réaffiche pas la demande à quelqu’un qui l’a vue dans les 30 derniers jours.
L’envoi des notifications se fait ensuite côté serveur (avec le package Open Cloud fourni par Roblox sur le Creator Store) ou par l’API Open Cloud, à partir de textes préparés dans le Creator Dashboard (99 caractères maximum au moment de la rédaction). Suis la page officielle pas à pas le jour où ton jeu remplit les conditions.
Roblox recommande des notifications personnalisées, liées à l’activité du joueur, qui l’invitent à une action immédiate, plutôt que des messages publicitaires génériques. Exemple dans l’esprit de la documentation : « Plus que 2 étapes pour atteindre le Sommet ! ».
Respecter le temps du joueur : les dark patterns
Un dark pattern (aujourd’hui souvent appelé deceptive pattern, « schéma trompeur ») est une conception qui manipule l’utilisateur pour lui faire faire quelque chose qu’il n’aurait pas choisi. La documentation des notifications d’expérience en interdit explicitement plusieurs :
- les publicités déguisées : une notification présentée comme une information importante qui mène en fait à une publicité ;
- la fausse pression temporelle : pousser à cliquer ou acheter avec une urgence inventée ;
- les faux cadeaux : promettre un objet gratuit qui demande en réalité autre chose ;
- les achats piégés : amener l’utilisateur, par la ruse, à faire des achats qu’il n’avait pas l’intention de faire.
Elle précise aussi qu’un jeu ne doit pas exiger l’activation des notifications pour participer ou progresser. Plus largement, les Community Standards de Roblox interdisent les contenus ou métadonnées trompeurs, sensationnalistes ou mensongers utilisés pour gagner en visibilité, en monétisation ou en engagement.
Les recommandations Roblox sur les season passes vont dans le même sens : une pause d’au moins une semaine entre deux saisons pour éviter l’épuisement des joueurs, des missions qui ne doivent pas occuper tout leur temps de jeu quotidien, et de la place pour jouer comme ils le souhaitent.
Ce qu’il faut retenir
- Roblox relie la rétention D7 à la progression et à la variété, la rétention D30 au contenu régulier et au social.
- Les objectifs quotidiens doivent être courts, modestes et ne jamais punir un jour manqué.
- Le social (invitations, classements, passages à deux) est un levier majeur sur Roblox.
- Badges et collections donnent des objectifs à long terme ; le contenu renouvelé se construit sur les systèmes existants, à un rythme tenable.
- Notifications d’expérience : 13 ans et plus, sur accord, une par jour au maximum, jamais obligatoires, sans dark pattern.
Sources et pour aller plus loin
- Retention — leviers D1, D7 et D30 (Roblox)
- Design for Roblox — touristes, habitués et jeu entre amis (Roblox)
- Quest design — quêtes quotidiennes et succès (Roblox)
- Experience notifications — conditions, limites et dark patterns interdits (Roblox)
- ExperienceNotificationService — référence de l’API (Roblox)
- Invite prompts — inviter des amis avec SocialService (Roblox)
- Badges — création et attribution (Roblox)
- BadgeService — référence de l’API (Roblox)
- Content updates — rythme des mises à jour (Roblox)
- LiveOps essentials (Roblox)
- Season pass design — éviter l’épuisement des joueurs (Roblox)
- Roblox Community Standards
- Deceptive patterns — catalogue des schémas trompeurs (deceptive.design)