Bande-annonce Roblox
SK=<chemin vers ce dossier de compétence>. Le brief pour lequel cette compétence a été construite : "enregistre-la, fais comme si je jouais, et monte-la aussi."
Tout ce qui concerne un jeu se trouve dans <jeu>/trailer/ : shots.json, clips/, out/. Les scripts sont génériques, et chaque nom spécifique au jeu (tags, remotes, texte des prompts, identifiants d'objets) se trouve dans shots.json.
Règles de base (à lire d'abord)
- Il enregistre l'écran réel de l'utilisateur. Avant d'enregistrer, dites à l'utilisateur dans le chat de garder Studio au premier plan et non couvert, de garer la souris en dehors de la vue du jeu, de ne pas toucher l'ordinateur jusqu'à ce que vous disiez que c'est fait, et obtenez son accord. Enregistrez uniquement la région calibrée de la fenêtre. Supprimez les prises de test et les prises non désirées avec
record.py clean. N'utilisez jamais-C(curseur). - Étiquette Studio : utilisez un seul serveur MCP Studio pour cela (écrit pour le serveur
robloxstudiode la communauté, pas le Roblox_Studio intégré). Vérifiez qu'aucun autre agent n'utilise Studio avant de lancer un playtest. Importez le kit en mode édition, retirez-le après, et ne sauvegardez jamais la place avec. - Honnêteté : Roblox rejette les vidéos qui montrent des fonctionnalités que le jeu ne possède pas, des graphismes améliorés ou des allégations publicitaires. Mettre en scène quel résultat réel arrive devant la caméra (forcer les chances pour une prise, offrir un objet) est acceptable. Simuler quelque chose que le jeu ne peut pas faire ne l'est pas ; restructurez plutôt le plan (voir le montage Or→Arc-en-ciel dans l'exemple).
- Pas d'utilisation d'ordinateur. Tout passe par des appels MCP eval, Python et ffmpeg.
- Gardez les cartons et le texte minimalistes ("thème sans bruit" : pas de bruit supplémentaire sur les outils). L'interface utilisateur du jeu elle-même est le meilleur texte.
Flux de travail
1. Planifier
Lisez references/shot-list-template.md. À partir du GAME.md, FINISHED.md et du code source du jeu, rédigez le tableau des prises de vue (accroche dans les 2-3 premières secondes, boucle de jeu principale, moment rare, social, base/progression, un système supplémentaire, carton-titre, un appel à l'action pour le social uniquement) et montrez-le à l'utilisateur avant d'enregistrer. Ensuite, écrivez <jeu>/trailer/shots.json (schéma dans references/luau-api.md ; commencez à partir de assets/shots.template.json, ou references/example.shots.json pour un exemple complet).
python3 $SK/scripts/build_kit.py list --shots <shots.json> résume la durée brute des séquences.
2. Prises de vue en mode jeu et cinématiques (Luau)
scripts/TrailerDriver.luauexécute une prise sur un client de playtest : se téléporte à la position de départ, désactive les contrôles clavier, parcourt les waypoints (Humanoid:MoveTo, pathfinding, sauts, tremblement humain), se tourne vers les cibles, appuie sur les ProximityPrompts (InputHoldBegin/End), invoque des remotes ou bindables, et change de caméra sur signal ou sur événement de jeu. Sa caméra joueur est un suivi avec retard, dérive de souris, tremblement et regards. Le HUD du jeu reste allumé pour les plans de gameplay et s'éteint pour les cinématiques ; la barre supérieure Roblox, les CoreGui et le curseur sont toujours désactivés. Chaque exécution arrête d'abord la précédente et restaure tout ensuite.scripts/CameraRig.luaucontient les presets cinématographiques : travelling/spline/survol, Bézier, orbite, grue, push-in, whip (avec flou de mouvement) et statique. Tous sont animés en douceur via TweenService et ont des durées configurables.- Pour les installer :
build_kit.py rbxmx→import_rbxmdans ReplicatedStorage (mode édition) → démarrer le playtest → envoyerbuild_kit.py call --shot IDaveceval_client_runtime. Lancez d'abordbuild_kit.py server --shot IDaveceval_server_runtimesi la prise nécessite une configuration. Détails et liste complète des actions :references/luau-api.md.
3. Enregistrer
references/recording.md. En résumé : record.py calibrate une fois (le conducteur colore la fenêtre en cyan et le script la trouve), puis pour chaque prise record.py shot ID --start-ms <startsAtMs> --dur <dur>. Il attend le démarrage planifié du conducteur, enregistre le pré-rouleau + prise + fin de la fenêtre uniquement, et stocke le décalage de coupe exact. Si l'enregistrement d'écran n'est pas disponible, record.py stitch transforme les captures d'écran sauvegardées en clip.
4. Monter
references/editing.md. edit.py build --cut roblox --format landscape crée l'export Roblox (30 s max, 1080p60 H.264, sans appel à l'action). --cut social --format both crée un format 16:9 plus 9:16. Le texte est dessiné avec Pillow car le ffmpeg de Homebrew peut ne pas avoir drawtext. Si Fredoka One n'est pas installée, demandez avant de la télécharger dans assets/fonts/ ; elle se rabat sur Arial Rounded Bold.
5. QA
qa.py clips --shots ... après l'enregistrement ; qa.py final <mp4> --roblox après le montage. Il vérifie les images perdues, les images noires et figées, les bandes d'interface Studio sur les bords, le drapeau du curseur et les limites Roblox, et écrit une planche contact. Ouvrez la planche avec Read et regardez-la : un panneau Studio égaré, un curseur ou un mauvais état du HUD s'y voient. Montrez ensuite la coupe à l'utilisateur (chemin plus planche) et prenez des notes pour un nouveau montage. Les nouveaux montages ne nécessitent que edit.py.
6. Nettoyer
Arrêtez le playtest, supprimez ReplicatedStorage.TrailerKit, lancez record.py clean --out <trailer> --shots <shots.json>, et supprimez <trailer>/build/. Gardez clips/ (les séquences sources) et out/.
Table des références
| Fichier | Quand le lire |
|---|---|
references/shot-list-template.md | planification ; transformer GAME.md en plans |
references/luau-api.md | écrire shots.json ; API du conducteur et du rig ; cibles, actions, déclencheurs, presets |
references/recording.md | avant la première prise ; calibration, synchronisation, solutions de secours, plans à deux joueurs |
references/editing.md | bloc de montage, transitions, cartons, polices et emojis, audio, vertical |
references/roblox-video-specs.md | limites de téléversement Roblox et règles de contenu, avec sources |
references/worked-example.md + example.shots.json | exemple complet (un jeu de tirage d'œufs à éclore, "🥚 Pet Roll") |
Scripts
| Script | Objectif |
|---|---|
scripts/TrailerDriver.luau, scripts/CameraRig.luau | exécution (client) |
scripts/build_kit.py | kit rbxmx, snippets eval, solution de secours en ligne, snippets serveur, liste de plans |
scripts/record.py (wrapper record.sh) | fenêtres, calibrer, prise, assembler, nettoyer |
scripts/edit.py | construire les coupes, prévisualiser les cartons, lister les polices |
scripts/qa.py | vérifications des clips et finales, planches contact |
scripts/check_luau.sh | luau-analyze avec un préambule de globales Roblox (fonctionne sans les définitions de types Roblox installées) |
Validez après avoir modifié les scripts : python3 -m py_compile $SK/scripts/*.py et $SK/scripts/check_luau.sh $SK/scripts/*.luau.
Lacunes connues (corrigez-les ici quand vous les rencontrez)
- Le conducteur ne peut pas cliquer sur les boutons de l'interface graphique. Utilisez la remote que le bouton appelle (
invoke), comme le fait la prise d'éclosion. - Un
localOffsetfixe depuis un tag est une première estimation ; attendez-vous à l'ajuster après la première prise de chaque plan. - La caméra joueur ne modélise pas le zoom de la molette de la souris. Utilisez
look.distpour changer la distance entre les battements. - La configuration serveur ne peut pas
requireles modules en direct du jeu : execute_luau/eval_server_runtime reçoivent un cache require FRAIS (mesuré le 2026-10-11 sur un jeu d'éclosion d'œufs :PlayerState.all()était vide alors que le joueur était chargé). Placez la configuration dans un Script RunContext=Server importé près du kit qui expose un BindableFunction, et faites en sorte que les snippetsserverl':Invoke. Motif : un ScriptTrailerHook(uniquement pour la bande-annonce, jamais sauvegardé dans la place) quirequireles propres modules du jeu depuis la VM serveur du jeu et créeServerStorage.TrailerHook(BindableFunction,:Invoke(cmd, args) -> (ok, result)), avec une petite commande par étape de configuration (donner de l'argent, ajouter un objet d'un certain niveau, préparer un minuteur, forcer les chances du prochain tirage,restore). Il enregistre chaque valeur de configuration qu'il modifie et les restaure surrestoreet lorsque le Script est détruit. Regroupez-le en un.rbxmxde la même manière quebuild_kit.pyregroupe le kit. - La fenêtre de Studio avec l'Explorateur/Propriétés ancré est d'environ 1.26:1 sur un écran de 1470x956 pt ; masquez les panneaux (ou Affichage > Plein écran) avant de calibrer, sinon le recadrage 16:9 jette un tiers de l'image.