Join the RoClicks Discord
RoClicks
VFX

Roblox VFX

Builds hits, slashes, explosions, projectiles, auras and camera shake from layered ParticleEmitters with custom textures and flipbooks. Includes an attribute-driven emit module, EditableMesh shapes (crescents, shockwaves, swirls) and a capture tool that freezes an effect at chosen moments so you can check it frame by frame.

Built on Roqer's roblox-animation-vfx skill (MIT); the licence ships in the zip.

SKILL.md

SK = the folder this skill is installed in (for example <skills-dir>/roblox-vfx). Adapted from the VFX half of Roqer's roblox-animation-vfx skill (github.com/S4US/Roqer, skills MIT-licensed by TabooHarmony, LICENSE-ROQER-SKILLS.txt), re-pointed at the robloxstudio MCP, plain python3 and the blender MCP.

Read LESSONS.md first. It holds every rule the developer has taught about effects, and it wins over anything below that disagrees. Write new VFX feedback there.

The loop

  1. Name the move (basic skill, ultimate, pickup, aura...) and where the player sees it. That sets size, palette and timing (vfx-design.md §1).
  2. Plan the layers from a skeleton (vfx-craft.md §4) on the intensity curve (vfx-design.md §6): anticipation, flash, body, secondaries, smoke.
  3. Draw the textures with numpy (vfx-textures.md), preview them in Studio without uploading.
  4. Build the template in ReplicatedStorage.VFX.<Name> with Build, attributes for timing (EmitCount/EmitDelay/EmitDuration).
  5. Check it in edit mode with Capture.hold at 4-6 moments, close and from the player's camera (vfx-craft.md §6). Fix, re-check.
  6. Upload the settled textures in one batch, swap out preview addresses, wire it to gameplay (server fires an UnreliableRemoteEvent, each client plays it), and check once in a playtest.
  7. Tell the developer what was checked; ask for a look at full speed; write feedback into LESSONS.md.

References (load what the effect needs, together in one go)

File Load when
references/vfx-design.md Always. What the effect is for, palette, value (dark layers, black twins), brightness vs bloom, layers, timing curve, motion. Numbers measured from published effects
references/vfx-craft.md Always. Runtime install, emit attributes, replication, particle properties, layer skeletons with Build examples, budgets, the check loop
references/vfx-textures.md Most effects: drawing particle textures and flipbooks, preview, check, upload
references/vfx-motion.md Projectiles, volleys, trails, beams, slashes, dashes, orbs, sigils, auras
references/vfx-mesh-shapes.md Crescent meshes, shockwave rings, swirls, domes, ground waves
references/vfx-camera-world.md Camera shake, FOV, blur, impact frames, lights, craters, scorch marks, cast pose from code
references/vfx-rendered-flipbooks.md A flipbook rendered from a 3D scene in Blender instead of drawn
references/vfx-reference.md The developer supplied a video/GIF of an effect to match

Tools in this skill

Path What
templates/Emit.luau Plays effects from attributes; VFX.play(template, cf), VFX.emit(inst); handle freeze, setTimeScale, stop
templates/Build.luau Build.run(path, steps): JSON/table steps -> instances (sequences, ranges, enums, $id links), one undo step, report string; Build.previewLeftovers()
templates/Capture.luau Capture.aim, Capture.playerView, Capture.hold(template, cf, t), Capture.slow, Capture.release, Capture.marker
templates/Shapes.luau EditableMesh shapes (Arc, Ring, TornRing, Cone, Swirl, Shell, custom) baked from spot parts; Shapes.prepare(template)
scripts/bundle_runtime.py Writes the four modules into one .rbxmx (Folder VFX) for import_rbxm
scripts/vfxtex.py numpy texture library (tex_stroke, tex_blob, tex_warp, draw_flipbook...) + CLI check, review, preview, clean-preview
scripts/vfxblender.py For the blender MCP: flipbook() renders a scene to a sheet; vfx_arc/ring/cone/swirl/shell/surface; export_glb
scripts/clip_frames.py Reference clip -> labelled frame sheet + timing/brightness/colour table (ffmpeg)

Ground rules

  • Particles, not 3D objects. Effects are layered ParticleEmitters, Beams and Trails with real textures. Never ball/part clusters for smoke, fire or explosions. Mesh shapes are a layer (crescent, shockwave), not the effect.
  • Studio = robloxstudio MCP, never the built-in Roblox_Studio server, except upload_image for textures (robloxstudio has no upload auth). Say so when using it.
  • Never push Luau with set_script_source (it expands \n); use bundle_runtime.py / an .rbxmx + import_rbxm.
  • Tool calls in one turn race. Hold/aim in one turn, capture_screenshot in the next.
  • require caches in edit mode for the whole Studio session: after changing a module, re-import it and its dependents before re-checking.
  • Effects are client-side. Server decides, fires names + CFrames over an UnreliableRemoteEvent (< 1000 bytes); damage never waits on an effect.
  • Uploads are irreversible and moderated: only the settled set, one batch, say how many first.
  • Keep each effect's texture script and asset-id map in the game's project folder (<game>/vfx/<effect>/), so it can be redrawn and re-uploaded.