Roblox animation and VFX
Works with a stock Roblox Studio MCP plus a shell. Its references record what experienced Roblox VFX artists actually do, measured from about 5,000 particle emitters in their published effects. Follow them: the difference between slop and a good effect is almost entirely in those numbers (palette, dark layers, brightness against bloom, layer timing, custom textures) and in looking at the effect frame by frame.
Read references/tools.md first, every time. The references were written
for the original toolkit (build_instances, capture_moments, the animation
and blender tools, upload_assets). tools.md says what to use instead with
your Studio MCP and this skill's scripts. Wherever a reference names an original
tool, do what tools.md maps it to.
This folder (where this file is) is SKILL_DIR in tools.md.
What's here
| Path | What it is |
|---|---|
references/tools.md | How to do every step with the Studio MCP, the shell and Blender. |
references/vfx-design.md | What the effect is for, palette, value, brightness, layers, timing. |
references/vfx-craft.md | Where effects live, the emit module, layer skeletons, budgets, how to check an effect. |
references/vfx-textures.md | Drawing the effect's own textures and flipbooks (Blender + numpy). |
references/vfx-motion.md | Projectiles, volleys, trails, beams, slashes, dashes, orbs, auras. |
references/vfx-mesh-shapes.md | Crescent and ring meshes, swirls, domes, ground waves, made in Blender. |
references/vfx-camera-world.md | Camera shake, FOV, impact frames, lights, craters, cast poses. |
references/vfx-rendered-flipbooks.md | Flipbooks rendered from a 3D scene. |
references/vfx-reference.md | Matching a reference clip (partly: see tools.md). |
references/character-animation.md | The pose format and tested R15/R6 recipes. |
references/creature-animation.md | Rigs, waves, gait, and creature recipes. |
references/full.md | Animation playback: tracks, priorities, blending, markers. |
templates/vfx/emit.lua | The player module (VFX.play, VFX.emit, handles with slow-mo and hitstop). |
templates/vfx/build.lua | Builds instances from the references' JSON steps. |
templates/vfx/capture.lua | Holds a playing effect at chosen moments for screenshots. |
scripts/animate.mjs | Pose compiler + motion checks + contact sheet + Luau output (Node 18+). |
scripts/read_rig.lua | Reads a creature's rig for animate.mjs --rig-json. |
scripts/blender_job.py, scripts/vfx_blender.py | Runs a Blender job with the fx.* texture and mesh helpers. |
scripts/texture-tool.mjs | Checks flipbook sheets; previews textures in Studio without uploading. |
scripts/upload.mjs | Open Cloud uploads (textures, meshes, animations). |
Quick reference
- Any visual effect (a hit, slash, explosion, spell, aura or pickup): load
references/tools.md,references/vfx-design.mdandreferences/vfx-craft.md, plus the topics it needs:vfx-textures.mdto draw the effect's own textures (most effects should; built-inrbxasset://textures/particles/*are stand-ins only);vfx-motion.mdfor anything that travels, sweeps or is held;vfx-mesh-shapes.mdfor crescent, ring, swirl and dome meshes;vfx-camera-world.mdfor camera, screen and ground reactions, and a cast pose from code;vfx-rendered-flipbooks.mdfor a sheet rendered from a 3D scene;vfx-reference.mdwhen the user gives a reference clip.
- The loop that makes effects good: design (name the move, pick ~5
colours, plan dark layers and the intensity curve) > build in
ReplicatedStorage.VFXwith the emit attributes > capture it frozen at 4-6 moments from close up and from the player's camera > fix what the frames show > repeat. Never call an effect done from one screenshot or from the code alone. - A character animation: load
references/character-animation.mdandreferences/tools.md; write the pose JSON from the closest recipe; runscripts/animate.mjswith--sheetand look at the sheet; fix until every check passes; send the Luau it writes withexecute_luau; preview on a dummy. Check which rig (R15 or R6) the place's players use first. - A creature or any non-stock model: also load
references/creature-animation.md, read its rig withscripts/read_rig.luaand pass--rig-json. - Load tracks through an
Animatoron aHumanoidorAnimationController; setAnimationTrack.Prioritydeliberately. - Use
GetMarkerReachedSignal()for gameplay cues (a hit landing), from a keyframe'smarkers; a keyframe'snameis not a marker. Play an attack's effect from its marker, not a timer. - A burst
ParticleEmitterusually hasRate = 0and fires fromEmitCount/EmitDelaythrough the emit module. - Effects are presentation: the server fires an
UnreliableRemoteEventwith the effect's name and a CFrame, each client callsVFX.play. Never let damage wait on an effect. - Upload only settled textures, meshes and animations: every upload is permanent and moderated. Say how many you will upload first.
Effects are judged by eye. When done, tell the user what you checked and ask them to look at it at full speed in a playtest.