Roblox 트레일러
SK=<이 스킬 폴더의 경로>. 이 스킬이 만들어진 목적: "녹화하고, 마치 내가 플레이하는 것처럼 보이게 하고, 편집도 해 줘."
게임별 모든 파일은 <game>/trailer/에 위치합니다: shots.json, clips/, out/. 스크립트는 일반적이며, 모든 게임별 이름(태그, 리모트, 프롬프트 텍스트, 아이템 ID)은 shots.json에 있습니다.
기본 규칙 (먼저 읽으세요)
- 사용자의 실제 화면을 녹화합니다. 녹화 전, 사용자에게 채팅으로 스튜디오를 최상단에 두고 가리지 않은 상태로 유지하고, 마우스를 게임 뷰 밖에 두고, 컴퓨터를 만지지 말라고 알린 후 사용자의 확인을 받으세요. 보정된 뷰포트 영역만 녹화하세요. 테스트 및 잘못된 테이크는
record.py clean으로 삭제하세요.-C(커서)는 절대 사용하지 마세요. - 스튜디오 예절: 하나의 Studio MCP 서버를 사용하세요(커뮤니티
robloxstudio서버를 대상으로 작성되었으며, 내장 Roblox_Studio 서버가 아닙니다). 플레이테스트를 시작하기 전에 다른 에이전트가 스튜디오를 사용 중인지 확인하세요. 편집 모드에서 키트를 가져오고, 사용 후에는 제거하며, 키트가 포함된 채로 플레이스를 저장하지 마세요. - 정직함: Roblox는 게임에 없는 기능, 향상된 그래픽 또는 광고 주장을 보여주는 비디오를 거부합니다. 카메라에 어떤 실제 결과가 나올지 연출하는 것(테이크의 확률을 강제로 조정하거나, 아이템을 부여하는 것)은 괜찮습니다. 게임이 할 수 없는 것을 가짜로 만드는 것은 안 됩니다. 대신 샷을 재구성하세요(예제의 Gold→Rainbow 몽타주 참조).
- 컴퓨터 사용 금지. 모든 작업은 MCP eval 호출, Python 및 ffmpeg를 통해 이루어집니다.
- 카드와 텍스트는 간결하게 유지하세요("테마는 있지만 노이즈는 없음": 도구에 불필요한 노이즈를 추가하지 마세요). 게임 자체 UI가 최고의 텍스트입니다.
워크플로우
1. 계획
references/shot-list-template.md를 읽으세요. 게임의 GAME.md, FINISHED.md 및 소스 코드로부터 샷 테이블(처음 2-3초에 후크, 핵심 루프, 희귀한 순간, 소셜, 기반/진행, 추가 시스템, 타이틀 카드, 소셜 전용 CTA)을 작성하고 녹화 전에 사용자에게 보여주세요. 그런 다음 <game>/trailer/shots.json을 작성하세요(스키마는 references/luau-api.md에 있으며, assets/shots.template.json 또는 전체 예제는 references/example.shots.json에서 시작하세요).
python3 $SK/scripts/build_kit.py list --shots <shots.json> 명령으로 원시 푸티지의 총 길이를 확인합니다.
2. 게임플레이-POV 및 시네마틱 샷 (Luau)
scripts/TrailerDriver.luau는 플레이테스트 클라이언트에서 하나의 샷을 실행합니다: 시작 포즈로 순간이동, 키보드 컨트롤 비활성화, 웨이포인트 이동(Humanoid:MoveTo, 경로 탐색, 점프, 사람 같은 떨림), 대상 방향으로 회전, ProximityPrompt 누르기(InputHoldBegin/End), 리모트 또는 바인더블 호출, 큐 또는 게임 이벤트에 따라 카메라 전환. 플레이어 카메라는 마우스 같은 드리프트, 떨림 및 시선 이동이 있는 지연 추적입니다. 게임 HUD는 게임플레이 샷에서는 켜져 있고, 시네마틱에서는 꺼집니다. Roblox 상단 바, CoreGui 및 커서는 항상 꺼집니다. 각 실행은 먼저 이전 실행을 중지하고 모든 것을 복원합니다.scripts/CameraRig.luau에는 시네마틱 프리셋이 있습니다: 돌리/스플라인/플라이오버, 베지어, 오빗, 크레인, 푸시인, 위프(모션 블러 포함), 정적. 모두 TweenService 곡선을 통해 이징 처리되며 구성 가능한 지속 시간을 가집니다.- 적용 방법:
build_kit.py rbxmx→import_rbxm을 ReplicatedStorage에 (편집 모드) → 플레이테스트 시작 →build_kit.py call --shot ID를eval_client_runtime으로 전송. 샷에 설정이 필요한 경우 먼저build_kit.py server --shot ID를eval_server_runtime으로 실행하세요. 자세한 내용과 전체 액션 목록은references/luau-api.md를 참조하세요.
3. 녹화
references/recording.md를 참조하세요. 간단히 말하면: record.py calibrate를 한 번 실행하면(드라이버가 뷰포트를 청록색으로 칠하고 스크립트가 이를 찾습니다), 그런 다음 각 샷에 대해 record.py shot ID --start-ms <startsAtMs> --dur <dur>를 실행합니다. 드라이버의 예약된 시작을 기다린 후, 프리롤 + 샷 + 테일(뷰포트만)을 녹화하고 정확한 트림 오프셋을 저장합니다. 화면 녹화가 불가능한 경우 record.py stitch가 저장된 capture_screenshot 프레임을 클립으로 변환합니다.
4. 편집
references/editing.md를 참조하세요. edit.py build --cut roblox --format landscape는 Roblox 업로드용(최대 30초, 1080p60 H.264, CTA 없음)을 만듭니다. --cut social --format both는 16:9와 9:16을 모두 만듭니다. 텍스트는 Pillow로 그려집니다(Homebrew의 ffmpeg에는 drawtext가 없을 수 있기 때문). Fredoka One이 설치되지 않은 경우 assets/fonts/에 다운로드하기 전에 확인을 요청하세요. 폴백 폰트는 Arial Rounded Bold입니다.
5. QA
녹화 후 qa.py clips --shots ...를 실행합니다. 편집 후 qa.py final <mp4> --roblox를 실행합니다. 드롭된 프레임, 검은 프레임, 정지 프레임, 가장자리의 스튜디오 UI 밴드, 커서 플래그, Roblox 제한을 확인하고 접촉 시트를 작성합니다. Read와 함께 시트를 열어 살펴보세요: 잘못된 스튜디오 패널, 커서 또는 잘못된 HUD 상태가 나타납니다. 그런 다음 사용자에게 컷(경로와 시트)을 보여주고 재편집을 위한 메모를 받으세요. 재편집은 edit.py만 필요합니다.
6. 정리
플레이테스트를 중지하고, ReplicatedStorage.TrailerKit을 삭제하고, record.py clean --out <trailer> --shots <shots.json>을 실행하고, <trailer>/build/를 제거하세요. clips/(원본 푸티지)와 out/은 유지하세요.
참조 맵
| 파일 | 읽을 때 |
|---|---|
references/shot-list-template.md | 계획 시; GAME.md를 샷으로 변환할 때 |
references/luau-api.md | shots.json 작성 시; 드라이버 및 리그 API; 대상, 액션, 트리거, 프리셋 |
references/recording.md | 첫 테이크 전; 보정, 동기화, 폴백, 2인 샷 |
references/editing.md | 편집 블록, 전환, 카드, 폰트 및 이모지, 오디오, 세로 |
references/roblox-video-specs.md | Roblox 업로드 제한 및 콘텐츠 규칙 (출처 포함) |
references/worked-example.md + example.shots.json | 전체 작업 예제 (펫 부화 롤 게임, "🥚 Pet Roll") |
스크립트
| 스크립트 | 목적 |
|---|---|
scripts/TrailerDriver.luau, scripts/CameraRig.luau | 런타임 (클라이언트) |
scripts/build_kit.py | rbxmx 키트, eval 스니펫, 인라인 페이로드 폴백, 서버 스니펫, 샷 목록 |
scripts/record.py (record.sh 래퍼) | 윈도우, 보정, 샷, 스티치, 정리 |
scripts/edit.py | 컷 빌드, 카드 미리보기, 폰트 목록 |
scripts/qa.py | 클립 및 최종 검사, 접촉 시트 |
scripts/check_luau.sh | Roblox 전역 프리루드로 luau-analyze 실행 (Roblox 타입 정의가 설치되지 않은 상태에서도 작동) |
스크립트 변경 후 검증: python3 -m py_compile $SK/scripts/*.py 및 $SK/scripts/check_luau.sh $SK/scripts/*.luau.
알려진 격차 (발견 시 여기에 수정하세요)
- 드라이버는 GUI 버튼을 클릭할 수 없습니다. 버튼이 호출하는 리모트를 사용하세요(
invoke)(부화 샷에서처럼). - 태그의
localOffset은 첫 번째 추정치이며, 각 샷의 첫 번째 테이크 후 조정이 필요할 수 있습니다. - 플레이어 카메라는 마우스 휠 줌을 모델링하지 않습니다.
look.dist를 사용하여 비트 사이의 거리를 변경하세요. - 서버 설정은 라이브 게임 모듈을
require할 수 없습니다:execute_luau/eval_server_runtime은 새로운 require 캐시를 얻습니다(2026-10-11 측정, 펫 부화 게임: 플레이어가 로드되었는데도PlayerState.all()이 비어 있었습니다). 설정을 키트 옆에 임포트되는 RunContext=Server Script에 넣고, BindableFunction을 노출시키며,server스니펫이 이를:Invoke하도록 만드세요. 패턴:TrailerHookScript (트레일러 전용, 플레이스에 저장되지 않음)는 게임 자체 모듈을 게임 서버 VM 내부에서require하고ServerStorage.TrailerHook(BindableFunction,:Invoke(cmd, args) -> (ok, result))을 생성합니다. 설정 단계별로 하나의 작은 명령을 가집니다(현금 지급, 특정 등급 아이템 추가, 타이머 준비, 다음 롤 확률 강제,restore). 변경한 모든 구성 값을 저장하고restore시 및 Script가 파괴될 때 복원합니다.build_kit.py가 키트를 패키징하는 것과 같은 방식으로.rbxmx로 패키징하세요. - Explorer/Properties가 도킹된 스튜디오 뷰포트는 1470x956 pt 화면에서 약 1.26:1입니다. 보정 전에 패널을 숨기거나(또는 View > Full Screen) 16:9 크롭이 그림의 1/3을 버리지 않도록 하세요.