Trailer Roblox
SK=<caminho para esta pasta de skill>. A briefe para a qual esta skill foi construída: "grave, faça parecer que estou jogando e edite também."
Tudo por jogo vive em <jogo>/trailer/: shots.json, clips/, out/. Os scripts são genéricos, e cada
nome específico do jogo (tags, remotes, texto de prompt, ids de item) vive em shots.json.
Regras básicas (leia primeiro)
- Grava a tela real do usuário. Antes de gravar, avise ao usuário no chat para manter o Studio em primeiro plano e
descoberto, estacionar o mouse fora da view do jogo, e não tocar no computador até você dizer que terminou, e obtenha a confirmação dele.
Grave apenas a região calibrada da viewport. Exclua takes de teste e tomadas avulsas com
record.py clean. Nunca use-C(cursor). - Etiqueta do Studio: use um servidor MCP do Studio para isso (escrito contra o servidor da comunidade
robloxstudio, não o Roblox_Studio embutido). Verifique se nenhum outro agente está usando o Studio antes de iniciar um playtest. Importe o kit no modo de edição, remova-o depois, e nunca salve o lugar com ele. - Honestidade: a Roblox rejeita vídeos que mostram recursos que o jogo não possui, gráficos aprimorados ou alegações de anúncio. Encenar qual resultado real acontece na câmera (forçar probabilidades para um take, conceder um item) é aceitável. Fingir algo que o jogo não pode fazer não é; reformule a cena (veja a montagem Ouro → Arco-Íris no exemplo).
- Sem computer-use. Tudo passa por chamadas MCP eval, Python e ffmpeg.
- Mantenha cards e texto esparsos ("tema sem ruído": sem ruído extra nas ferramentas). A própria UI do jogo é o melhor texto.
Fluxo de trabalho
1. Planejar
Leia references/shot-list-template.md. A partir do GAME.md, FINISHED.md e código-fonte do jogo, escreva a tabela de cenas
(gancho nos primeiros 2-3 s, loop central, momento raro, social, base/progressão, um sistema extra, cartão de título, um CTA apenas para
social) e mostre ao usuário antes de gravar. Depois escreva <jogo>/trailer/shots.json (esquema em
references/luau-api.md; comece de assets/shots.template.json, ou references/example.shots.json para um exemplo completo).
python3 $SK/scripts/build_kit.py list --shots <shots.json> soma a filmagem bruta.
2. Cenas de gameplay-POV e cinematográficas (Luau)
scripts/TrailerDriver.luauexecuta uma cena em um cliente de playtest: teletransporta para a pose inicial, desabilita os controles do teclado, percorre waypoints (Humanoid:MoveTo, pathfinding, pulos, tremor humano), vira para enfrentar alvos, pressiona ProximityPrompts (InputHoldBegin/End), invoca remotes ou bindables, e troca câmeras sob comando ou em eventos do jogo. Sua câmera de jogador é um seguimento com atraso semelhante ao do mouse, com tremor e olhares. A HUD do jogo permanece ligada para cenas de gameplay e desliga para cenas cinematográficas; a barra superior do Roblox, CoreGui e cursor estão sempre desligados. Cada execução primeiro para a anterior e restaura tudo depois.scripts/CameraRig.luautem os presets cinematográficos: dolly/spline/flyover, bezier, orbita, grua, push-in, whip (com motion blur) e estático. Todos são suavizados por curvas TweenService e têm durações configuráveis.- Para colocá-los no jogo:
build_kit.py rbxmx→import_rbxmpara ReplicatedStorage (modo de edição) → inicie o playtest → enviebuild_kit.py call --shot IDcomeval_client_runtime. Executebuild_kit.py server --shot IDcomeval_server_runtimeprimeiro se a cena tiver configuração. Detalhes e a lista completa de ações:references/luau-api.md.
3. Gravar
references/recording.md. Resumindo: record.py calibrate uma vez (o driver pinta a viewport de ciano e o script
a encontra), então para cada cena record.py shot ID --start-ms <iniciaEmMs> --dur <duracao>. Ele espera o início agendado do driver, grava pré-rolagem + cena + cauda apenas da viewport, e armazena o deslocamento de corte exato. Se a gravação de tela não estiver disponível, record.py stitch transforma quadros salvos de capture_screenshot em um clipe.
4. Editar
references/editing.md. edit.py build --cut roblox --format landscape faz o upload Roblox (30 s no máximo, 1080p60
H.264, sem CTA). --cut social --format both faz 16:9 mais 9:16. O texto é desenhado com Pillow porque o ffmpeg do Homebrew
pode não ter drawtext. Se Fredoka One não estiver instalada, pergunte antes de baixá-la em assets/fonts/; ela cai para
Arial Rounded Bold.
5. QA
qa.py clips --shots ... após a gravação; qa.py final <mp4> --roblox após a edição. Verifica quadros perdidos,
quadros pretos e congelados, bordas da UI do Studio nas laterais, a flag de cursor e os limites do Roblox, e escreve uma folha de contato.
Abra a folha com Read e olhe para ela: um painel perdido do Studio, um cursor ou o estado errado da HUD aparecem lá.
Depois mostre ao usuário o corte (caminho mais folha) e anote para um recorte. Recortes só precisam de edit.py.
6. Limpar
Pare o playtest, exclua ReplicatedStorage.TrailerKit, execute record.py clean --out <trailer> --shots <shots.json>,
e remova <trailer>/build/. Mantenha clips/ (a filmagem fonte) e out/.
Mapa de referências
| Arquivo | Quando ler |
|---|---|
references/shot-list-template.md | planejamento; transformar GAME.md em cenas |
references/luau-api.md | escrever shots.json; API do driver e rig; alvos, ações, gatilhos, presets |
references/recording.md | antes do primeiro take; calibração, sincronização, fallbacks, cenas de 2 jogadores |
references/editing.md | bloco de edição, transições, cards, fontes e emoji, áudio, vertical |
references/roblox-video-specs.md | limites de upload Roblox e regras de conteúdo, com fontes |
references/worked-example.md + example.shots.json | exemplo completo (um jogo de rolagem para chocar pets, "🥚 Pet Roll") |
Scripts
| Script | Propósito |
|---|---|
scripts/TrailerDriver.luau, scripts/CameraRig.luau | runtime (cliente) |
scripts/build_kit.py | kit rbxmx, snippets eval, fallback inline payload, snippets servidor, lista de cenas |
scripts/record.py (wrapper record.sh) | windows, calibrate, shot, stitch, clean |
scripts/edit.py | construir cortes, cards de pré-visualização, listar fontes |
scripts/qa.py | verificação de clipes e finais, folhas de contato |
scripts/check_luau.sh | luau-analyze com um prelúdio de globais Roblox (funciona sem definições de tipo Roblox instaladas) |
Valide após alterar scripts: python3 -m py_compile $SK/scripts/*.py e $SK/scripts/check_luau.sh $SK/scripts/*.luau.
Lacunas conhecidas (corrija-as aqui quando encontrá-las)
- O driver não consegue clicar em botões GUI. Use o remote que o botão chama (
invoke), como faz a cena de chocar. - Um
localOffsetfixo a partir de uma tag é um primeiro palpite; espere ajustá-lo após o primeiro take de cada cena. - A câmera do jogador não modela o zoom da roda do mouse. Use
look.distpara alterar a distância entre os beats. - A configuração do servidor não pode
requireos módulos ativos do jogo: execute_luau/eval_server_runtime obtém um cache require NOVO (medido em 2026-10-11 em um jogo de chocar pets:PlayerState.all()estava vazio enquanto o jogador estava carregado). Coloque a configuração em um Script RunContext=Server importado ao lado do kit que expõe uma BindableFunction, e faça os snippetsserver:Invoke-la. Padrão: um ScriptTrailerHook(apenas trailer, nunca salvo no lugar) querequireos próprios módulos do jogo de dentro da VM do servidor e criaServerStorage.TrailerHook(BindableFunction,:Invoke(cmd, args) -> (ok, resultado)), com um pequeno comando por etapa de configuração (dar dinheiro, adicionar um item de um determinado tier, deixar um timer pronto, forçar as probabilidades da próxima rolagem,restore). Ele salva todo valor de configuração que altera e os restaura emrestoree quando o Script é destruído. Empacote-o em um.rbxmxda mesma forma quebuild_kit.pyempacota o kit. - A viewport do Studio com Explorer/Properties encaixados tem cerca de 1,26:1 em uma tela de 1470x956 pt; oculte os painéis (ou View > Tela Cheia) antes de calibrar, ou o corte 16:9 joga fora um terço da imagem.