Tráiler de Roblox
SK=<ruta a esta carpeta del skill>. El resumen para el que se construyó este skill: "grábalo, haz que parezca que lo estoy jugando, y edítalo también".
Todo lo específico de cada juego vive en <juego>/trailer/: shots.json, clips/, out/. Los scripts son genéricos, y cada nombre específico del juego (tags, remotes, texto de prompts, ids de objetos) vive en shots.json.
Reglas básicas (léelas primero)
- Graba la pantalla real del usuario. Antes de grabar, dile al usuario en el chat que mantenga Studio en primer plano y descubierto, que aparque el ratón fuera de la vista del juego y que no toque el ordenador hasta que le digas que has terminado, y obtén su confirmación. Graba solo la región calibrada de la ventana. Borra las tomas de prueba y las erráticas con
record.py clean. Nunca uses-C(cursor). - Etiqueta de Studio: usa un servidor MCP de Studio para esto (escrito para el servidor comunitario
robloxstudio, no el integradoRoblox_Studio). Comprueba que ningún otro agente esté usando Studio antes de iniciar una prueba de juego. Importa el kit en modo edición, elimínalo después y nunca guardes el lugar con él. - Honestidad: Roblox rechaza videos que muestren características que el juego no tiene, gráficos mejorados o afirmaciones publicitarias. Escenificar qué resultado real ocurre en cámara (forzar probabilidades para una toma, conceder un objeto) está bien. Fingir algo que el juego no puede hacer no lo está; reestructura la toma en su lugar (véase el montaje Oro→Arcoíris en el ejemplo).
- No uses computer-use. Todo se hace a través de llamadas MCP eval, Python y ffmpeg.
- Mantén las tarjetas y el texto escasos ("tema sin ruido": sin ruido extra en las herramientas). La propia interfaz de usuario del juego es el mejor texto.
Flujo de trabajo
1. Planificar
Lee references/shot-list-template.md. A partir del GAME.md, FINISHED.md y el código fuente del juego, escribe la tabla de tomas (gancho en los primeros 2-3 s, bucle principal, momento raro, social, base/progresión, un sistema extra, tarjeta de título, un CTA solo para redes sociales) y muéstrala al usuario antes de grabar. Luego escribe <juego>/trailer/shots.json (esquema en references/luau-api.md; empieza desde assets/shots.template.json, o references/example.shots.json para un ejemplo completo).
python3 $SK/scripts/build_kit.py list --shots <shots.json> resume el metraje en bruto.
2. Tomas en primera persona y cinematográficas (Luau)
scripts/TrailerDriver.luauejecuta una toma en un cliente de prueba de juego: teletransporta a la pose inicial, desactiva los controles del teclado, recorre waypoints (Humanoid:MoveTo, pathfinding, saltos, temblor humano), gira para mirar objetivos, presiona ProximityPrompts (InputHoldBegin/End), invoca remotes o bindables, y cambia de cámara cuando se le indica o según eventos del juego. Su cámara de jugador es un seguimiento con retardo similar al del ratón, con deriva, temblor y miradas. El HUD del juego permanece activo para las tomas de jugabilidad y se desactiva para las cinematográficas; la barra superior de Roblox, el CoreGui y el cursor siempre están desactivados. Cada ejecución detiene primero la anterior y restaura todo después.scripts/CameraRig.luautiene los preajustes cinematográficos: dolly/spline/sobrevuelo, bezier, órbita, grúa, zoom, whip (con desenfoque de movimiento) y estático. Todos se suavizan mediante curvas de TweenService y tienen duraciones configurables.- Cómo cargarlos:
build_kit.py rbxmx→import_rbxmen ReplicatedStorage (modo edición) → iniciar la prueba de juego → enviarbuild_kit.py call --shot IDconeval_client_runtime. Ejecuta primerobuild_kit.py server --shot IDconeval_server_runtimesi la toma tiene configuración inicial. Detalles y la lista completa de acciones:references/luau-api.md.
3. Grabar
references/recording.md. En resumen: record.py calibrate una vez (el driver pinta la ventana de cian y el script la encuentra), luego para cada toma record.py shot ID --start-ms <startsAtMs> --dur <dur>. Espera al inicio programado por el driver, graba prerroll + toma + cola solo de la ventana, y almacena el desplazamiento exacto de edición. Si la grabación de pantalla no está disponible, record.py stitch convierte los fotogramas guardados de capture_screenshot en un clip.
4. Editar
references/editing.md. edit.py build --cut roblox --format landscape genera la subida a Roblox (30 s máximo, 1080p60 H.264, sin CTA). --cut social --format both genera 16:9 más 9:16. El texto se dibuja con Pillow porque el ffmpeg de Homebrew puede no tener drawtext. Si Fredoka One no está instalada, pregunta antes de descargarla en assets/fonts//; se usa como alternativa Arial Rounded Bold.
5. QA
qa.py clips --shots ... después de grabar; qa.py final <mp4> --roblox después de editar. Comprueba fotogramas perdidos, fotogramas negros y congelados, bandas de la interfaz de Studio en los bordes, el flag del cursor y los límites de Roblox, y escribe una hoja de contacto.
Abre la hoja con Read y mírala: un panel errante de Studio, un cursor o el estado incorrecto del HUD se ven ahí.
Luego muestra al usuario el corte (ruta más hoja) y toma notas para un recorte. Los recortes solo necesitan edit.py.
6. Limpiar
Detén la prueba de juego, elimina ReplicatedStorage.TrailerKit, ejecuta record.py clean --out <trailer> --shots <shots.json>, y elimina <trailer>/build/. Conserva clips/ (el metraje fuente) y out/.
Mapa de referencias
| Archivo | Cuándo leerlo |
|---|---|
references/shot-list-template.md | planificación; convertir GAME.md en tomas |
references/luau-api.md | escribir shots.json; API del driver y el rig; objetivos, acciones, disparadores, preajustes |
references/recording.md | antes de la primera toma; calibración, sincronización, alternativas, tomas de 2 jugadores |
references/editing.md | bloque de edición, transiciones, tarjetas, fuentes y emojis, audio, vertical |
references/roblox-video-specs.md | límites de subida de Roblox y reglas de contenido, con fuentes |
references/worked-example.md + example.shots.json | ejemplo completo (un juego de tirada de huevos mascota, "🥚 Pet Roll") |
Scripts
| Script | Propósito |
|---|---|
scripts/TrailerDriver.luau, scripts/CameraRig.luau | tiempo de ejecución (cliente) |
scripts/build_kit.py | kit rbxmx, fragmentos eval, fallback de carga útil en línea, fragmentos de servidor, lista de tomas |
scripts/record.py (envoltorio record.sh) | ventanas, calibrar, toma, stitch, limpiar |
scripts/edit.py | construir los cortes, tarjetas de vista previa, listar fuentes |
scripts/qa.py | comprobaciones de clips y finales, hojas de contacto |
scripts/check_luau.sh | luau-analyze con un preludio de globales de Roblox (funciona sin las definiciones de tipos de Roblox instaladas) |
Valida después de cambiar los scripts: python3 -m py_compile $SK/scripts/*.py y $SK/scripts/check_luau.sh $SK/scripts/*.luau.
Brechas conocidas (arréglalas aquí cuando las encuentres)
- El driver no puede hacer clic en botones GUI. Usa el remote que llama el botón (
invoke), como hace la toma de eclosión. - Un
localOffsetfijo desde un tag es una primera suposición; espera ajustarlo después de la primera toma de cada toma. - La cámara del jugador no modela el zoom de la rueda del ratón. Usa
look.distpara cambiar la distancia entre tiempos. - La configuración del servidor no puede
requirelos módulos del juego en vivo: execute_luau/eval_server_runtime obtienen una caché de require FRESCA (medido el 2026-10-11 en un juego de eclosión de mascotas:PlayerState.all()estaba vacío mientras el jugador estaba cargado). Pon la configuración en un Script RunContext=Server importado junto al kit que expone una BindableFunction, y haz que los fragmentos deserverla:Invoke. Patrón: un ScriptTrailerHook(solo del tráiler, nunca guardado en el lugar) querequirelos módulos propios del juego desde dentro de la VM del servidor del juego y creaServerStorage.TrailerHook(BindableFunction,:Invoke(cmd, args) -> (ok, result)), con un comando pequeño por paso de configuración (dar dinero, añadir un objeto de un nivel dado, preparar un temporizador, forzar las probabilidades del siguiente lanzamiento,restore). Guarda cada valor de configuración que cambia y los restaura conrestorey cuando el Script se destruye. Empaquétalo en un.rbxmxde la misma manera quebuild_kit.pyempaqueta el kit. - La ventana de Studio con el Explorador/Propiedades acoplados es aproximadamente 1.26:1 en una pantalla de 1470x956 pt; oculta los paneles (o Vista > Pantalla completa) antes de calibrar, o el recorte 16:9 descarta un tercio de la imagen.