roblox-vfx — Claude Code skill for Roblox effects
A skill for building and optimizing Roblox particles, beams, trails and highlights. Useful when an effect chokes on low-end phones.
npx skills add nonlooped/roblox-suite --skill roblox-vfx -a claude-codeWhat roblox-vfx does
The skill walks an agent through ParticleEmitter properties: texture, ColorSequence, NumberSequence for size and transparency, lifetime, Rate. Emitter shapes get their own section — Box, Sphere, Cylinder, Disc — with ShapeStyle, ShapeInOut and ShapePartial. Flipbooks are covered too: grid sheets, FlipbookMode, FlipbookBlendFrames.
Performance is the main thread. Cost comes from overlapping transparent layers, and the doc is blunt about the order of fixes: shrink total opaque pixel area first, lower Rate after. Profiling goes through View → Stats → GPU → Fill Rate and Render → Overdraw. For distant effects it suggests disabling emitters at 100–300 studs and halving Rate at half that distance.
One trap worth knowing: Sphere and Cylinder shapes do not display correctly when the emitter is parented to an Attachment. Use a BasePart parent instead — the part can be tiny and invisible. EmissionDirection is ignored entirely under an Attachment parent, so you rotate the Attachment itself. For one-shot bursts the doc favors client-authoritative emission: the server fires an event and each client spawns the burst locally.
What it helps with
- aim particle emission with the right shape and direction
- build an animated flipbook texture for an explosion
- cut overdraw from transparent effects on low-end devices
- disable costly emitters when the camera moves away
- fire a one-shot burst from an animation marker
Example prompts for the agent
- Build a spark hit effect: Attachment on the weapon, one-shot Emit from an animation marker
- This ParticleEmitter has too much overdraw on mobile — what should I reduce first?
- Set up a 4x4 flipbook for an explosion in OneShot mode
How to install roblox-vfx
1Skills CLI (Vercel)
npx skills add nonlooped/roblox-suite --skill roblox-vfx -a claude-code2Manually: put the files in place
~/.claude/skills/roblox-vfx/SKILL.mdCopy the whole skill folder; for one project use .claude/skills/roblox-vfx/
1Skills CLI (Vercel)
npx skills add nonlooped/roblox-suite --skill roblox-vfx -a codex2Manually: put the files in place
.agents/skills/roblox-vfx/SKILL.mdFor all projects use ~/.agents/skills/
1Skills CLI (Vercel)
npx skills add nonlooped/roblox-suite --skill roblox-vfx -a cursor2Manually: put the files in place
.cursor/skills/roblox-vfx/SKILL.mdCursor also reads .agents/skills/ and .claude/skills/
1GitHub CLI
gh skill install nonlooped/roblox-suite roblox-vfx2Manually: put the files in place
.github/skills/roblox-vfx/SKILL.md1Skills CLI (Vercel)
npx skills add nonlooped/roblox-suite --skill roblox-vfx -a gemini-cli2Platform CLI
gemini skills install https://github.com/nonlooped/roblox-suite --path roblox-vfxManually: put the files in place
.devin/skills/roblox-vfx/SKILL.mdThe legacy .windsurf/skills/ path still works
Skills CLI (Vercel)
npx skills add nonlooped/roblox-suite --skill roblox-vfx -a opencodeClaude.ai
Zip the folder and upload it in Settings → Capabilities → Skills
Step by step, with commands for each platform: How to install skills in Claude Code: five ways
Questions about roblox-vfx
How do I install roblox-vfx in Claude?
Run npx skills add nonlooped/roblox-suite --skill roblox-vfx -a claude-code. The skill file lands at ~/.claude/skills/roblox-vfx/SKILL.md.
What does roblox-vfx do?
It helps an agent build and optimize Roblox effects: particles, beams, trails, highlights. It covers emitter shapes, flipbooks, distance culling and fill-rate cost.
Why do Sphere or Cylinder shapes render wrong?
Sphere and Cylinder shapes do not display correctly when the emitter is parented to an Attachment. Parent such an emitter to a BasePart instead, even a tiny invisible one.
Source text
SKILL.md · MIT
---
name: roblox-vfx
description: "Build or optimize Roblox particles, beams, trails, and highlights. Use for emitter shapes, flipbooks, one-shot bursts, animation-marker effects, distance culling, and overdraw."
last_reviewed: 2026-06-17
---
# roblox-vfx
**Main source:** https://create.roblox.com/docs/en-us/effects/particle-emitters + the Effects section of the docs and the ParticleEmitter class reference.
Tune particle lifetime, size, transparency, and rate together. Profile overlapping transparent effects on the lowest target device.
For marker-triggered bursts, read [roblox-animation](../roblox-animation/SKILL.md). For UI particles, read [roblox-user-interfaces](../roblox-user-interfaces/SKILL.md); ParticleEmitters do not render inside ViewportFrame.
## Core creation and parenting
- Parent ParticleEmitter to a BasePart (emission fills bounds or chosen EmissionDirection face) **or** (strongly preferred for control) to an Attachment.
- Rotate the parent or the attachment to steer emission. EmissionDirection is ignored when parented to an Attachment; rotate the Attachment itself to aim particles.
- EmissionDirection only matters when parented to a part.
## Tune particle appearance
1. Texture (prefer .png with alpha; grayscale + LightEmission=1 to hide dark areas).
2. Color (ColorSequence; even a single Color3 in Studio is stored as a one-keypoint ColorSequence; use it for gradients over lifetime).
3. Size (NumberSequence, often with envelope for natural variation). **Warning:** Large sizes = high GPU fill-rate cost.
4. Transparency (NumberSequence). Fade particles in or out to avoid popping.
5. Lifetime (or NumberRange for per-particle random).
6. Rate (particles per second; hard caps ~400 desktop / 100 mobile per emitter; keep low and achieve density with other properties).
Then motion (Speed at birth, SpreadAngle, Acceleration for gravity/wind, Drag + WindAffectsDrag when global wind is enabled, VelocityInheritance, LockedToPart, TimeScale).
## Emitter shapes
Shape = Box / Sphere / Cylinder / Disc.
- ShapeStyle = Volume (everywhere inside) or Surface (only the skin).
- ShapeInOut = Inward / Outward / InAndOut.
- ShapePartial further modulates the shape. Cylinder: radius on the emission side. Disc: inner-radius proportion (`0` = fully closed disc, `1` = emission only on the outer rim). Sphere: hemispherical angle (`1` = full sphere, `0.5` = half-dome, `0` = point).
Sphere/Cylinder shapes do **not** display correctly when the emitter is parented to an Attachment. Only use them with a BasePart parent (the part can be tiny and invisible).
## Flipbooks (animated textures over particle life)
Prepare a grid sheet (2x2, 4x4, 8x8, Custom) with transparent spacing between frames (to prevent mip filtering from sampling adjacent frames).
- FlipbookLayout, FlipbookSizeX/Y.
- FlipbookFramerate (or random range, max 30).
- FlipbookMode: Loop, OneShot (explosions; ignores `FlipbookFramerate` and plays exactly once over the particle Lifetime), PingPong, Random (with crossfade; great for organic variation).
- FlipbookBlendFrames: crossfade between adjacent frames in Loop/OneShot/PingPong for smoother animation.
- FlipbookStartRandom: each particle starts at a random frame (useful when framerate is 0 for static but varied look).
**Memory warning:** Flipbooks are heavier. Reuse textures, keep resolution reasonable, limit unique animated emitters on low-memory clients (older phones will auto-disable flipbooks).
## Lighting and rendering controls
- LightEmission: 0 normal, 1 additive/glow (works even in dark scenes).
- LightInfluence: 0 = ignore world light, 1 = fully affected.
- Brightness: scales the light the emitter contributes when `LightInfluence` is 0. No effect when `LightInfluence` is 1.
- Orientation: FacingCamera (classic billboard), FacingCameraWorldUp, VelocityParallel, VelocityPerpendicular.
- ZOffset: render layer offset in studs (layer multiple emitters without moving them in 3D).
## Performance across devices
- Fill rate (pixels covered by overlapping transparent layers) and overdraw are the main GPU costs.
- Rate × Size × average opacity × how many overlap on screen = cost.
- Always test at both lowest and highest Studio Editor Quality Level.
- Mobile rate is capped lower.
- Use .Enabled = false to pause (existing particles continue until they die or you call :Clear()).
- Many simultaneous high-rate/large/transparent emitters will cause the engine to throttle or drop effects on low-end clients.
- Measure overdraw in Studio with **View → Stats → GPU → Fill Rate** and **Render → Overdraw**. Reduce total opaque pixel area before lowering Rate.
## Replication and client-authoritative emission
- ParticleEmitter state replicates, but individual particles do not. A server-owned emitter will spawn the same particles on every client automatically.
- For one-shot bursts, prefer **client-authoritative emission**: the server signals an event, each affected client spawns the burst locally. This avoids network replication of per-burst timing and respects each client's quality settings.
- Use `RemoteEvent:FireClient` or a local signal so clients own transient visuals; keep gameplay logic authoritative on the server.
## LOD and distance culling
- Stop or reduce expensive emitters when the camera is far away. Common thresholds: disable at 100–300 studs, reduce Rate by half at half-distance.
- Use `workspace.CurrentCamera` distance checks or zone systems. Avoid per-frame `Magnitude` checks for many emitters; instead use a tagged culling heartbeat or spatial partition.
- For ambient weather/large crowds, spawn emitters only in the near-camera region rather than globally.
## Preloading textures
- Call `ContentProvider:PreloadAsync({texture})` for flipbook atlases and prominent effect textures before they are needed (e.g., during loading screens or before a combat sequence). This prevents mid-burst pop-in on lower-end devices.
## Patterns
- Continuous ambient (fire, smoke, rain): Rate + Lifetime + Size tuned so density looks right at normal camera distances.
- One-shot bursts (explosion, impact, muzzle flash): Set Rate low or 0, then call emitter:Emit(num) from an animation marker or event.
- Attached effects (foot dust, weapon trail, aura): Parent emitter or its attachment to the moving part/bone. Use LockedToPart or VelocityInheritance as appropriate.
- Wind-reactive: Enable global wind in the environment, set Drag > 0 and WindAffectsDrag = true on the emitter.
- Combined with animation: Marker "FootStep" → find foot Attachment → Emit or play a short one-shot emitter.
See the references/ folder (particle-emitter-properties.md, shapes-flipbooks-and-advanced.md) for the exhaustive property reference, visual examples, optimization checklists, and concrete code for common effects (integration covered in SKILL and cross-skill notes).
## Related effects (often used alongside particles)
- Beam: textured ribbon between two Attachments (lasers, energy, ropes). Key properties: `Texture`, `TextureMode`/`TextureLength`/`TextureSpeed`, `Color`, `Transparency` (NumberSequence along the beam), `Width0`/`Width1`, `CurveSize0`/`CurveSize1`, `FaceCamera`, `LightEmission`, `LightInfluence`, `ZOffset`.
- Trail: ribbon left behind two Attachments as their parent part moves (sword trails, projectile paths, after-images). Key properties: `Color`, `Transparency`, `Texture`, `TextureMode`, `TextureLength`, `MinLength`, `MaxLength`, `WidthScale`, `LightEmission`, `LightInfluence`, `FaceCamera`, `Lifetime`.
- Highlight: cheap, effective outlines (selection, targeting, "powered up"). Has both an outline and a solid interior fill (`FillColor`/`FillTransparency`, `OutlineColor`/`OutlineTransparency`). `DepthMode` controls whether the highlight is visible through walls (`AlwaysOnTop`) or only when not occluded (`Occluded`). There is a client-side cap of 255 simultaneous `Highlight` instances (disabled instances still count toward the cap).
- PointLight / SpotLight / SurfaceLight + Atmosphere + PostProcessing for overall mood that makes particles read correctly.
## Cleanup for transient emitters
- Always destroy cloned one-shot emitters after their maximum lifetime (`Debris:AddItem` or `task.delay`). Do not leave disabled emitter instances accumulating in the workspace.
- For attached continuous emitters, set `Enabled = false` and `:Clear()` before reparenting or destroying to avoid orphaned particles.
- When pooling emitters, reset Rate, Lifetime, Size, and Transparency to known defaults before reuse so stale state does not leak into the next burst.
## Scripts
- `scripts/EffectBurst.lua`: clone-and-destroy helper for one-shot particle bursts. Clones every ParticleEmitter under a template Attachment/BasePart, emits a burst locally, and schedules cleanup after the maximum lifetime. Safe for continuous emitters because the original emitters are never mutated.
<!-- catalog:references:start -->
## Reference index
- [particle-emitter-properties.md](references/particle-emitter-properties.md): Tune particle appearance, motion, emission, or rendering cost.
- [shapes-flipbooks-and-advanced.md](references/shapes-flipbooks-and-advanced.md): Configure emitter shapes, animated textures, bursts, or distance culling.
<!-- catalog:references:end -->
© nonlooped · MIT · nonlooped/roblox-suite