Créateur d'interface Roblox
LICENCES D'ABORD. Les icônes proviennent d'UN SEUL pack d'icônes sous licence que vous (le développeur) possédez ; cette compétence ne fournit ni icônes ni textures. Lisez la licence de votre pack : la plupart des packs payants autorisent leur utilisation dans vos propres jeux mais interdisent la revente, la redistribution, les packs d'actifs et l'entraînement d'IA (si c'est le cas, n'envoyez jamais les PNG du pack à un modèle d'image). Dans les dépôts de jeux, commitez icons.json + le script de copie, pas le pack, sauf si la licence le permet. Les textures sont téléchargées par vous depuis https://ui-resources.com (UI_RESOURCES.md) ; créditez leurs créateurs.
Les outils d'import Figma sont pour des designs qui existent déjà dans Figma ; cette compétence est pour concevoir une nouvelle interface (ou recréer une capture d'écran) d'abord via HTML.
La boucle : référence -> jetons -> HTML (tous les états) -> le développeur vérifie -> apprendre -> importer -> vérifier.
Lisez LESSONS.md avant de toucher quoi que ce soit (chaque règle apprise, avec le bug derrière). Elle prime sur tout ce qui suit qui serait en désaccord.
Fichiers de cette compétence
| Fichier | Rôle |
|---|---|
LESSONS.md | chaque règle + pourquoi. Lisez en premier ; écrivez les retours du développeur dedans (REVIEW_LOOP.md) |
STYLE.md | lire la référence pour en extraire des jetons ; préréglages ; conversion des jetons CSS en table Roblox |
UI_RESOURCES.md | ui-resources.com : ce que c'est, trouver/télécharger, la texture stud et où la mettre |
PATTERNS.md | HUD, boutique, roue de caisse + probabilités, toasts, confirmation, chargement, tutoriel, bulle, objectif, listes |
PIPELINE.md | HTML -> JSON -> Roblox en détail : rbx.json, marqueurs d'export, table de correspondance, registre, modèles, copies |
REVIEW_LOOP.md | comment montrer les écrans, prendre les retours, obtenir l'approbation |
VERIFY.md | rendu simulé, vérification des propriétés, bac à sable en mode édition, clics de test, listes de contrôle |
ROBLOX_FACTS.md | faits mesurés sur le moteur et les outils MCP (inset, TextSize, téléchargements, captures) |
styles/ | stud.css (préréglage par défaut), glass.css (préréglage simulateur sombre) |
templates/examples/ | un projet d'interface fonctionnel : build.py, kit.css, icons.json, rbx.json |
templates/luau/ | Builder, UIKit, NumberFormat, Theme, client/UI + Controller, Toasts, UpdateInPlace, PixelRows, ProgressiveReveal, NextGoal, CrateRoll, LoadingScreen, PropertySweep, WorldHitTest |
scripts/ | read_reference, copy_icons, cdp/export/dump, gen, ledger, assets, bundle, mock/mockshot/mockdiff, check_copies, luau_to_rbxmx ; remake/ = outils de mesure 1:1 |
SK=<dossier de cette compétence> ci-dessous (le dossier où se trouve ce SKILL.md). Outils nécessaires : python3 avec PIL + numpy, node 22+, Google Chrome (rendus headless ; la variable d'environnement CHROME surcharge le chemin macOS), luau-analyze, un volet navigateur ou un outil d'automatisation de navigateur pour visualiser les pages (dans Claude Code desktop : mcp__Claude_Browser__*, chargez avec ToolSearch), un serveur MCP Studio qui peut exécuter Luau et importer des fichiers .rbxmx (cette compétence a été écrite pour le MCP communautaire robloxstudio) et le MCP intégré Roblox_Studio pour upload_image uniquement (ROBLOX_FACTS.md).
1. Brief, références, style (obligatoire : une référence de style)
- Obtenez le brief : quels écrans, ce qu'ils font, quelles données ils affichent, PC + téléphone. Listez chaque état dont chacun a besoin.
- Une image de référence de style est obligatoire. Utilisez celle donnée par le développeur. Si aucune : demandez une fois (« envoyez une capture d'écran du style que vous voulez ; ou j'utiliserai le style stud »). S'ils disent d'y aller : préréglage stud. La plupart des jeux sont stud.
- Faites d'abord la configuration du projet à l'étape 4 (elle crée
ui/), puis enregistrez la référence sousui/ref.png. Les références de mise en page (la boutique d'un autre jeu) sont distinctes de la référence STYLE. - Lisez-la depuis
ui/(STYLE.md section 2) :python3 $SK/scripts/read_reference.py ref.png-> palette, contour px, indication de texture, style de texte, densité +ref_palette.png,ref_zoom.png(lisez-la pour VOIR les studs/le brillant) et une ébauchestyle.css. Confirmez chaque valeur à l'œil, ne gardez que les surcharges du préréglage choisi. - « Comme le jeu X » = inspiré par, pas une copie, sauf si le développeur dit « refais-le 1:1 » (alors LESSONS section 7 et
scripts/remake/).
2. Textures depuis ui-resources.com
Le style stud DOIT porter une texture stud. Cette compétence n'en fournit pas : téléchargez vous-même la « texture Stud » (tag Stud) de ui-resources.com depuis https://ui-resources.com, convertissez-la en vrai PNG si nécessaire, et enregistrez-la sous ui/stud.png dans votre projet (4x4 studs par tuile, tuilée à 112 px avec un mélange overlay). Pour tout autre chose (papier, soleils, demi-teintes, arrière-plans), cherchez d'abord sur le site et enregistrez les téléchargements dans ui/tex/ (UI_RESOURCES.md : filtres, ?tag=Stud, lecture des URLs chargées paresseusement, file + sips pour les WebP-nommés-png). Créditez les créateurs dans l'en-tête de build.py.
3. Icônes : votre pack d'icônes uniquement
Les icônes proviennent d'UN SEUL pack d'icônes vectorielles sous licence que le développeur possède (un pack vectoriel par projet ; ne mélangez jamais les packs), jamais d'emojis. Trouvez les icônes en parcourant ou en cherchant dans le dossier ou le catalogue du pack (par exemple find <pack> -iname '*coin*'). Après la configuration de l'étape 4, éditez ui/icons.json ({"slug": "Nom du fichier d'icône ou chemin dans le pack"} ; la liste de l'exemple est un point de départ) et exécutez python3 $SK/scripts/copy_icons.py icons.json --pack <votre pack d'icônes> dans ui/ (ajoutez --prefer " Outline" ou l'équivalent de votre pack pour prendre les variantes de contour en premier). Jamais d'emojis, fermer = texte "X". Cherchez des synonymes avant de déclarer quoi que ce soit manquant.
4. Construisez chaque écran en HTML/CSS
Configurez une fois dans le dépôt du jeu (faites ceci avant que les étapes 1-3 n'écrivent quoi que ce soit dans ui/ ; cp -n n'écrase jamais) :
mkdir -p ui && cp -rn $SK/templates/examples/. ui/ && cd ui
cp <votre texture stud téléchargée> stud.png && cp -r $SK/styles . # texture stud depuis ui-resources.com
cp <référence> ref.png && python3 $SK/scripts/read_reference.py ref.png # -> style.css (ébauche)
python3 $SK/scripts/copy_icons.py icons.json --pack <votre pack d'icônes> && python3 build.py # -> *.html + index.html
python3 -m http.server 8870 --bind 127.0.0.1 # run_in_background ; ou l'entrée launch.json ci-dessous + preview_start
.claude/launch.json dans le dépôt du jeu (puis mcp__Claude_Browser__preview_start {name: "ui"}) :
{ "version": "0.0.1", "configurations": [
{ "name": "ui", "runtimeExecutable": "python3",
"runtimeArgs": ["-m", "http.server", "8870", "--bind", "127.0.0.1", "--directory", "ui"], "port": 8870 } ] }
Éditez build.py (c'est la source de vérité ; ne modifiez jamais à la main les fichiers .html générés). Règles les plus importantes :
- Stage 1920x1080, px absolus ; composants partagés (
plate,panel,card,T,I) pour que les frères partagent un même traitement ; seules les couleurs varient. Le style vient des jetons :kit.css(structure) ->styles/<preset>.css(UI_STYLE=glass python3 build.pypour changer) ->style.css(ce jeu).?style=glassprévisualise en direct. - Marqueurs d'export :
grp(name, html, anchor)= un cadre Roblox de premier niveau ancré à un bord d'écran ;name=sur chaque label/icône/bouton en direct ;sub(..., btn=True, opens='Boutique');hid=Truepour les états exportés mais cachés. PIPELINE.md section 2 a la table complète. - Tous les états sur
states.html; mise en page téléphone (hud_phone.html) ; chaque élément runtime (toasts, confirmation, récompense, tutoriel, panneaux) surtemplates.html; montrez les pièces en contexte sur une capture de jeu réelle une fois qu'elle existe. - Pas de guillemets doubles dans les
style="..."en ligne ; pas d'élément nommé Active/Visible/Position... ; utilisezhid(opacité 0), jamais display:none, pour les choses que le jeu active/désactive. - Auto-vérification : ouvrez chaque page avec
?checkdans le volet navigateur (checkOverflow()ne doit retourner aucun débordement et aucune image cassée) ; rendez 2x des captures headless (REVIEW_LOOP.md) et regardez-les.
5. Arrêt : le développeur vérifie
Montrez style.html + le premier écran dans le premier tour, puis le reste (REVIEW_LOOP.md). Attendez un oui explicite. Chaque correction : trouvez la règle générale, écrivez-la dans LESSONS.md (règle, puis pourquoi), appliquez-la partout, dites au développeur en une ligne ce que vous avez sauvé. Pas de travail Roblox avant approbation.
6. Importation dans Roblox (après approbation)
Détail complet : PIPELINE.md. Depuis ui/ avec le serveur en cours d'exécution :
# première importation seulement : le runtime Luau + builder (puis remplacez "<Gui>" dans ../roblox/ui/client/UI.luau par le "gui" de rbx.json)
mkdir -p ../roblox/ui/client && cp -n $SK/templates/luau/*.luau ../roblox/ui/ && cp -n $SK/templates/luau/client/*.luau ../roblox/ui/client/
rm -f ../roblox/ui/LoadingScreen.client.luau ../roblox/ui/CrateRoll.luau # ceux-ci vivent dans ReplicatedFirst / ReplicatedStorage
node $SK/scripts/export.mjs # layout JSON + 2x PNG transparents par pièce raster -> rbx/out/
python3 $SK/scripts/gen.py # Data_<Screen>.luau, Data_Templates, Data_Manifest -> luau_out ; art -> rbx/out/upload
python3 $SK/scripts/mock.py && node $SK/scripts/mockshot.mjs # rendu Roblox-sémantique hors ligne : différence moyenne 1-3 par écran
python3 $SK/scripts/ledger.py 20 # prochaines URLs à télécharger ; téléchargez avec mcp__Roblox_Studio__upload_image(+studio_id),
# puis : echo '<result json>' | python3 $SK/scripts/ledger.py 20 ; répétez jusqu'à ce qu'il en reste 0
python3 $SK/scripts/assets.py # AssetIds.luau
python3 $SK/scripts/bundle.py # rbx/out/<Gui>Build.rbxmx
Règles de téléchargement : <= 20 par lot, ouvrez le lieu du GROUPE quand le jeu est possédé par un groupe, ne re-téléchargez jamais ce que le registre a, sondez les ids étrangers. Ensuite dans Studio via robloxstudio : détruisez l'ancien ServerStorage.<Gui>Build -> import_rbxm du .rbxmx dans ServerStorage -> require(game.ServerStorage.<Gui>Build.Builder).build() -> activez le gui, Builder.fit() deux fois, désactivez.
Ne jamais utiliser set_script_source (maltraite les \n) ; toujours .rbxmx + import_rbxm.
Câblez le code du jeu (le Controller démarre UI + UIKit ; démonstration des nombres uniquement avec l'attribut gui PreviewMode) :
client/UI.luau (ouvrir/fermer/retour, boutons attrayants avec les attributs Button/Opens, Échap, scrim, file d'attente des popups, compteurs) + UIKit.luau (contrat de modèle : cloner, set avec les jumeaux Shadow, icônes, barres, pluriel/article, worldLabel) + NumberFormat.luau. Le code du jeu clone les modèles ; il ne construit jamais un look avec Instance.new. Consignez chaque modification runtime apportée aux écrans importés (PIPELINE.md section 8).
7. Vérification dans Studio
VERIFY.md, dans l'ordre : pas d'images vides ; ratios d'ajustement ; PropertySweep.atSizes à 1920x1080 / 1366x768 / 844x390 ; le bac à sable en mode édition (clonez le gui, requirez le clone de l'UI, pilotez, UI.destroy(), Archivable=false) ; test de jeu seulement si nécessaire (vérifiez qu'aucun autre test de jeu n'est en cours) : une capture magenta n'est pas une UI cassée ; vrais clics à AbsolutePosition + size/2 +58 px ; profil de périphérique téléphone ; test de clics rapides ; les listes se mettent à jour sur place. luau-analyze --mode=nonstrict sur chaque fichier client ; check_copies.py pour que les copies dans Studio correspondent au disque.
8. Itération
Nouveaux retours -> LESSONS.md -> HTML -> approbation -> exportez seulement la page modifiée -> gen -> le registre ne télécharge que les nouveaux arts -> bundle -> Builder.buildScreen("<Screen>") (un panneau en place) ou build() -> fit -> vérifiez.
Jamais
Des emojis ou un deuxième pack d'icônes ; des icônes générées par IA ; l'envoi de fichiers de pack d'icônes à un modèle quand la licence interdit l'utilisation d'IA ; du texte intégré dans des images ; l'importation avant approbation ; l'édition manuelle de Data_*.luau ; set_script_source ; des valeurs de démonstration écrites pendant que le vrai client du jeu tourne ; des récompenses auto-réclamées ; une ligne ou un marqueur tracé sur un prix ; des ids ou noms spécifiques au jeu à l'intérieur de ce dossier de compétence.