Communitygithub.com

ridhotamma/roblox-animation

로블록스 R6/R15 아바타 애니메이션을 설계, 미리보기 및 내보냅니다. 사용자가 원하는 동작을 JSON 기반 모션 스펙으로 작성하면 3D 미리보기와 스토리보드를 제공하고, 최종적으로 KeyframeSequence(.rbxmx 파일 및 Studio 커맨드바 스크립트)를 생성합니다.

roblox-animation란 무엇인가요?

이 스킬은 로블록스 R6 및 R15 리그를 위한 애니메이션을 설계, 미리보기 및 내보낼 수 있게 해줍니다. 사용자는 동작을 몇 개의 키 포즈(‘오른쪽 위팔 90도 앞으로’, ‘무릎 60도 굽힘’ 등 해부학 용어)로 구성된 JSON 모션 스펙으로 작성합니다. 엔진은 로블록스 조인트 계산, 보간, 발을 바닥에 고정하는 그라운딩, 3D 미리보기, 경고 메시지, 최종 키프레임 내보내기 등을 자동으로 처리합니다. 워크플로우는 모션 단계 계획 → 스펙 작성 → 빌드 → 자체 스토리보드 확인 → 수정 → 미리보기 및 키프레임 전달 순서로 진행됩니다. 이 스킬은 Node.js만 있으면 작동하며, Cursor, Codex, Claude Code 등 모든 개발 환경에서 사용할 수 있습니다. 사용자가 로블록스 애니메이션, 키프레임 시퀀스, Motor6D 포즈, 공격/감정 표현/대기/달리기 사이클을 요청하거나 기존 애니메이션 수정 및 재타이밍을 요청할 때 유용합니다.

지원 대상~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/ridhotamma/roblox-developer-skills/tree/HEAD/skills/roblox-animation

즐겨 사용하는 AI에게 물어보기

이 에이전트 스킬이 미리 로드된 새 채팅을 엽니다.

문서

Roblox 애니메이션 (R6 / R15)

당신은 모션을 작은 JSON 모션 스펙으로 작성합니다. 몇 개의 키 포즈를 해부학 용어("오른쪽 위팔 90° 앞으로", "무릎 60° 굽힘")로 표현합니다. 번들 엔진이 수동으로 하기 어려운 모든 작업을 처리합니다: 두 리그에 대한 로블록스 조인트 계산, 보간, 발을 바닥에 고정, 3D 미리보기, 안전성 경고, 베이크된 키프레임 내보내기.

사용자는 결과를 시청하여 판단하므로, 루프는 다음과 같습니다: 단계 계획 → 스펙 작성 → 빌드 → 직접 스토리보드 확인 → 수정 → 미리보기 + 키프레임 전달. 확인 단계를 건너뛰지 마십시오. 종이 위에서 올바르게 보이는 포즈 번호도 실제로 보면 종종 잘못 보입니다(팔이 가슴을 뚫거나, 차기가 공에 닿지 않음).

워크플로우

  1. 모션을 구체화하세요. 리그(R6 또는 R15; 명확히 추론할 수 없는 경우에만 질문하고, 기본값은 R15임을 알리세요), 손잡이, 루프 또는 원샷 여부, 대략적인 지속 시간, 필요한 게임플레이 후크(히트 프레임, 공 릴리스, 발소리). 명확한 요청이 있으면 바로 작업을 시작하세요.
  2. 숫자를 쓰기 전에 단계로 나누세요. 거의 모든 동작은: 준비 → 예측 → 동작 → 후속 동작 → 회복입니다. 해당 장르(전투, 스포츠, 이동 루프, 곡예, R6 특화)에 대해 references/motion-cookbook.md를 읽으세요. 타이밍 표와 포즈 레시피가 있습니다.
  3. 스펙을 <name>.json으로 작성하세요. 처음부터 시작하지 말고 examples/에서 가장 가까운 파일을 복사해 시작하세요.
  4. 빌드: node <skill>/scripts/ranim.cjs <name>.json --out out (여러 스펙을 전달할 수 있으며, 하나의 미리보기에서 탭이 됩니다). Node만 필요하며 패키지는 필요 없습니다.
  5. stdout에 출력된 리포트를 읽으세요. 각 키에서 머리, 손, 발의 실제 위치를 나열합니다(stud 단위: R = 캐릭터의 오른쪽, U = 바닥 위, F = 앞쪽) 그리고 WARN 줄을 출력합니다. 위치를 사용하여 의도를 확인하세요: 주먹이 정말 가슴 앞에 있습니까? 발이 공 높이에 있습니까?
  6. Read 도구로 out/storyboard-<Name>.png를 확인하세요. (3/4 뷰와 측면 뷰의 모든 키). PNG가 생성되지 않은 경우 헤드리스 브라우저로 out/preview.html을 스크린샷하거나 SVG를 읽으세요. 각 패널을 의도한 단계와 비교하세요.
  7. 수정하고 다시 빌드하여 포즈가 명확하게 읽히고 경고가 사라지거나 의식적으로 수용될 때까지 하세요. 2-3회 반복하는 것이 일반적입니다.
  8. 전달: 대화형 out/preview.html (아티팩트로 게시하거나 파일로 보내기) 및 out/<Name>.rbxmx와 out/<Name>.lua. 가능하면 스토리보드 이미지를 인라인으로 보여주세요. 사용자에게 Studio로 가져오는 방법(아래)과 어떤 애니메이션 이벤트가 있는지 간략히 알려주세요.

모션 스펙

{
  "name": "JabCross",            // KeyframeSequence 이름과 파일 이름이 됩니다
  "title": "잽-크로스 콤보",    // 미리보기에서 표시됩니다
  "rig": "R15",                  // "R15" 또는 "R6"
  "priority": "Action",          // Idle | Movement | Action | Action2..4 | Core
  "loop": false,
  "description": "미리보기 옆에 표시되는 한두 문장.",
  "keys": [
    { "t": 0, "label": "guard", "note": "단계 목록에 표시됩니다.",
      "pose": { "UpperTorso": { "turnR": 10, "bendFwd": 8 },
                "LeftUpperArm": { "fwd": 50, "out": 8 }, "LeftLowerArm": { "bend": 120 },
                "LeftFoot": "flat" } },
    { "t": 0.1, "label": "jab", "ease": "out", "copy": "guard",
      "pose": { "LeftUpperArm": { "fwd": 86, "in": 22 }, "LeftLowerArm": { "bend": 6 } } },
    { "t": 0.8, "label": "recover", "copy": "guard" }
  ],
  "markers": [ { "t": 0.1, "name": "Hit", "value": "jab" } ],
  "props": [ { "type": "ball", "radius": 0.6, "color": "#e07a2c", "keys": [ ... ] } ]
}

(주석은 설명을 위한 것입니다. 파일은 일반 JSON이어야 합니다.)

선택적 최상위 필드: fps (기본값 30; 매우 빠른 동작은 60 사용), duration (마지막 키로 기본 설정), grounding ("off"로 수동 높이 제어), mirror: true (전체 클립 좌우 반전, 예: 왼발 버전), endKeyframe: true.

키

  • t 초 (프레임 단위로 스냅됨). 첫 번째 키는 0입니다.
  • pose 관절 이름 → 채널을 도(degree) 단위로 매핑합니다. 키에 포함되지 않은 관절은 단순히 해당 키를 통해 보간되므로, 중간 키는 중요한 관절만 언급할 수 있습니다. 한 번도 언급되지 않은 관절은 기본 위치(0°)에 머물며 내보내지지 않습니다. 키 0 이후에 처음 언급된 관절은 기본 위치(0°)에서 시작합니다.
  • copy: 이전 키의 레이블 또는 인덱스. 포즈는 복사본으로 시작하며 pose가 그 일부를 재정의합니다. copy와 함께 "mirror": true를 사용하면 좌우가 바뀝니다. 이렇게 하여 절반 보폭으로 걷기/달리기 사이클을 만듭니다.
  • ease 이 키에서 떠나는 구간의 모양을 결정합니다: smooth (기본값, 오버슈트 없이 자연스럽게 완화), linear, in (천천히 시작, 빠르게 끝남: 타격을 가하기 위한 풀업), out (빠르게 시작, 천천히 끝남: 충격), inOut, hold, overshoot, anticipate, bounce, elastic.
  • lift: 이 키에서 바닥 위 가장 낮은 신체 지점의 높이(stud 단위, 기본값 0). 점프를 만드는 방법입니다. Grounding 참조.

관절 및 채널

각도는 해부학적이며, 같은 단어가 신체 양쪽에서 같은 의미를 가지므로 반전된 포즈는 부호 변경이 필요 없습니다. 각 채널에는 반대 방향 별칭이 있습니다. 자연스러운 쪽을 사용하세요.

관절채널 (반대 방향 별칭)
루트: LowerTorso (R15), Torso (R6)bendFwd (bendBack), turnL (turnR), leanR (leanL), moveFwd (moveBack), moveR (moveL), moveUp (moveDown) (stud 단위)
척추: UpperTorso, HeadbendFwd (bendBack), turnL (turnR), leanR (leanL)
상지: Left/RightUpperArm, Left/RightUpperLeg; R6 Left Arm, Right Arm, Left Leg, Right Legfwd (back) 팔다리를 앞/위로 흔듦, out (in) 몸에서 멀어지거나 가로지름, twistOut (twistIn) 자신의 길이를 따라 회전
Left/RightLowerArm, Left/RightLowerLegbend: 팔꿈치와 무릎이 자연스러운 방향으로 굽힘 (0 = 직선)
Left/RightHand, Left/RightFootfwd (back), out (in), twistOut (twistIn). 발은 또한 문자열 "flat"을 허용

랜드마크: 팔 fwd: 90은 정면을 가리키고, fwd: 180은 위를 가리키며, out: 90은 T-포즈입니다. 다리 fwd: 90은 허리 높이의 앞차기입니다. 회전은 부모에서 자식으로 구성되므로, 가슴의 회전은 팔을 함께 움직입니다. Head를 반대 방향으로 돌려 눈을 목표물에 고정하세요.

R6에는 6개의 파트가 있고 팔꿈치, 무릎, 손, 발이 없으므로 실루엣은 몸통과 전체 팔다리 각도에서 나옵니다. 약간 과장하세요. R6 팔다리 이름에는 공백이 포함됩니다("Right Arm").

그라운딩

기본적으로 엔진은 모든 프레임에서 루트를 낮추거나 올려 신체의 가장 낮은 지점이 바닥 위 정확히 lift stud 높이에 있도록 합니다. 결과:

  • 웅크리기, 런지, 스플릿은 자동으로 엉덩이를 낮춥니다. 서 있는 포즈를 위해 엉덩이 높이를 수동으로 조정하지 마세요.
  • R15 발에 "flat"을 사용하면 다리가 무엇을 하든 발바닥이 평평하게 유지되도록 발목을 해결합니다. 바닥에 닿는 모든 발에 사용하세요. 공중에 있거나 발끝으로 서 있는 발에는 명시적인 각도("back": 40 = 발끝을 편 자세)를 제공하세요.
  • 점프는 공중 키의 lift 값입니다(도약 시 작게, 정점에서 가장 크게, 착지 시 0). 공중에서의 몸 회전은 루트에 적용됩니다: 백플립은 루트의 bendBack이 키를 가로질러 0 → 360으로 실행됩니다(각도는 연속적이므로 360은 "0으로 돌아감"이 아닌 완전 회전입니다).
  • 그라운딩이 켜져 있는 동안 루트의 moveUp은 무시됩니다. 수영이나 등반과 같이 바닥이 관련 없는 경우에만 "grounding": "off"로 설정하세요.
  • 게임 내 점프와 대시는 일반적으로 애니메이션이 아닌 캐릭터 컨트롤러에 의해 이동됩니다. 게임플레이 점프 중에 재생되는 애니메이션의 경우 몸을 포즈로 지정하고 lift를 0으로 두세요. 자체 포함된 감정 표현, 홉이 있는 공격, 뒤집기의 경우 lift와 moveFwd를 사용하세요. 클립이 시작 위치와 다른 위치에서 끝나면 리포트가 경고합니다. Roblox는 트랙이 멈출 때 몸을 다시 원래 위치로 스냅하기 때문입니다.

마커 및 소품

  • markers는 KeyframeMarker가 되어 게임에서 track:GetMarkerReachedSignal("Hit")로 읽을 수 있습니다. 게임플레이에 중요한 모든 프레임(히트 윈도우, 공 접촉 또는 릴리스, 발소리, 사운드 큐)에 하나씩 배치하세요.
  • props는 미리보기 전용이며(내보내지 않음) 모션이 상호작용하는 대상을 기준으로 판단할 수 있도록 존재합니다. type: "ball"과 radius, 또는 다른 타입은 size: [x, y, z]를 가진 상자(검은 길고 얇은 상자). at은 파트 이름(소품이 해당 파트를 따름; offset: [right, up, fwd]는 파트 자체 축 기준) 또는 캐릭터 아래 바닥 지점에서의 고정점 [right, up, fwd](stud 단위)입니다. 여러 keys를 사용하면 소품이 앵커 사이를 이동합니다. arc는 해당 키에서 떠나는 구간에 포물선 상승을 추가합니다(슛 또는 패스). examples/jump_shot.json 및 examples/soccer_kick.json 참조.

좋은 결과의 기준

  • 읽을 수 있는 실루엣. 스토리보드에서 각 키는 실루엣만으로도 인식 가능해야 합니다. 인접한 두 키가 비슷해 보이면 둘 중 하나는 아무런 역할을 하지 않는 것입니다.
  • 타이밍의 대비. 느린 예측, 매우 빠른 동작(2~4프레임), 후속 동작에서 짧은 멈춤, 느린 회복. 키 사이의 균일한 간격은 동작이 가볍게 느껴지는 가장 흔한 이유입니다.
  • 전신이 참여합니다. 힘은 발과 엉덩이에서 시작하여 가슴, 어깨, 손 또는 발로 전달됩니다. 풀업 시 엉덩이와 가슴에 반대 회전을 주고, 먼 쪽 팔이 가까운 쪽 팔을 균형 잡게 하세요.
  • 발은 고정됩니다. 바닥에 닿은 발은 키 간에 리포트에서 R 및 F 숫자를 유지합니다. 움직여야 하는 경우 중간 키에서 들어 올리세요(스텝).
  • 경고 없음, 또는 유지하는 각 경고에 대한 이유. 한계는 자연스러운 관절 범위입니다. 초과한다면 일반적으로 다른 채널이 의도된 것입니다.

Roblox Studio로 가져오기

사용자에게 두 가지 방법과 이벤트 이름을 모두 알려주세요.

  • 커맨드 바 (가장 빠름): 탐색기에서 리그를 선택하고, 보기 → 커맨드 바를 열고, <Name>.lua의 전체 내용을 붙여넣고 Enter를 누르세요. KeyframeSequence가 리그의 AnimSaves에 나타납니다(아무것도 선택되지 않은 경우 ServerStorage에 나타남). 애니메이션 편집기에서 로드하여 조정할 수 있습니다.
  • 파일: <Name>.rbxmx를 Studio 뷰포트로 드래그하거나, 서비스를 우클릭 → 파일에서 삽입을 선택하세요.
  • 게시: 라이브 게임에서 재생하려면 업로드해야 합니다. 애니메이션 편집기에서 열어 게시하거나, KeyframeSequence를 우클릭 → Roblox에 저장한 다음, 결과 자산 ID를 Animation 객체 및 Animator:LoadAnimation에서 사용하세요. Studio에서 빠른 로컬 테스트를 위해 game:GetService("KeyframeSequenceProvider"):RegisterKeyframeSequence(seq)는 임시 ID를 반환합니다. Studio 메뉴는 때때로 변경되므로, 단계가 사용자가 보는 것과 일치하지 않으면 주장하지 말고 말한 다음 현재 표현을 찾아보세요.

내보내기는 베이크됩니다: 모든 프레임에 대해 선형 이징이 있는 하나의 키프레임이므로, Studio는 해당 유형의 모든 리그에서 미리보기와 정확히 동일하게 재생합니다. 스펙이 애니메이션 처리하는 관절만 기록되므로, 상체 전용 애니메이션은 다리가 기본 걷기를 위해 자유롭게 둡니다. R15 출력은 AuthoredHipHeight를 전달하므로 다른 비율의 아바타로 리타겟팅됩니다.

파일

  • scripts/ranim.cjs — 엔진, 미리보기 및 내보내기를 하나의 파일로 제공합니다. 모듈로도 사용 가능: const R = require('.../ranim.cjs'); const c = R.compile(spec); R.report(c); R.sample(c, t).
  • scripts/selftest.cjs — Roblox의 Motor6D 공식에 대한 조인트 수학을 확인합니다. 엔진 편집 후 실행하세요.
  • examples/ — soccer_kick, jump_shot (볼 소품이 있는 스포츠), jab_cross (R15 전투), r6_sword_slash (무기를 사용한 R6 전투), backflip (전신 회전 및 점프), r6_run (반전된 루프).
  • references/motion-cookbook.md — 장르별 타이밍 표와 포즈 레시피. 제작하기 전에 관련 섹션을 읽으세요.

관련 스킬