{"slug":"roblox-vfx","title":"roblox-vfx","summary":"Build or optimize Roblox particles, beams, trails, and highlights. Use for emitter shapes, flipbooks, one-shot bursts, animation-marker effects, distance culling, and overdraw.","platform":"Claude","tags":[],"authorName":"LLM Mart","authorSlug":"llm-mart","score":0,"source":"github","price":null,"verified":false,"createdAt":"2026-10-18T17:23:58.082238Z","repo":{"url":"https://github.com/nonlooped/roblox-suite","stars":22,"forks":0,"license":"MIT","updatedAt":"2026-10-17T23:48:49Z"},"bodyHtml":"<hr>\n<h2>name: roblox-vfx\ndescription: \"Build or optimize Roblox particles, beams, trails, and highlights. Use for emitter shapes, flipbooks, one-shot bursts, animation-marker effects, distance culling, and overdraw.\"\nlast_reviewed: 2026-06-17</h2>\n<h1>roblox-vfx</h1>\n<p><strong>Main source:</strong> <a href=\"https://create.roblox.com/docs/en-us/effects/particle-emitters\">https://create.roblox.com/docs/en-us/effects/particle-emitters</a> + the Effects section of the docs and the ParticleEmitter class reference.</p>\n<p>Tune particle lifetime, size, transparency, and rate together. Profile overlapping transparent effects on the lowest target device.</p>\n<p>For marker-triggered bursts, read <a href=\"../roblox-animation/SKILL.md\">roblox-animation</a>. For UI particles, read <a href=\"../roblox-user-interfaces/SKILL.md\">roblox-user-interfaces</a>; ParticleEmitters do not render inside ViewportFrame.</p>\n<h2>Core creation and parenting</h2>\n<ul>\n<li>Parent ParticleEmitter to a BasePart (emission fills bounds or chosen EmissionDirection face) <strong>or</strong> (strongly preferred for control) to an Attachment.</li>\n<li>Rotate the parent or the attachment to steer emission. EmissionDirection is ignored when parented to an Attachment; rotate the Attachment itself to aim particles.</li>\n<li>EmissionDirection only matters when parented to a part.</li>\n</ul>\n<h2>Tune particle appearance</h2>\n<ol>\n<li>Texture (prefer .png with alpha; grayscale + LightEmission=1 to hide dark areas).</li>\n<li>Color (ColorSequence; even a single Color3 in Studio is stored as a one-keypoint ColorSequence; use it for gradients over lifetime).</li>\n<li>Size (NumberSequence, often with envelope for natural variation). <strong>Warning:</strong> Large sizes = high GPU fill-rate cost.</li>\n<li>Transparency (NumberSequence). Fade particles in or out to avoid popping.</li>\n<li>Lifetime (or NumberRange for per-particle random).</li>\n<li>Rate (particles per second; hard caps ~400 desktop / 100 mobile per emitter; keep low and achieve density with other properties).</li>\n</ol>\n<p>Then motion (Speed at birth, SpreadAngle, Acceleration for gravity/wind, Drag + WindAffectsDrag when global wind is enabled, VelocityInheritance, LockedToPart, TimeScale).</p>\n<h2>Emitter shapes</h2>\n<p>Shape = Box / Sphere / Cylinder / Disc.</p>\n<ul>\n<li>ShapeStyle = Volume (everywhere inside) or Surface (only the skin).</li>\n<li>ShapeInOut = Inward / Outward / InAndOut.</li>\n<li>ShapePartial further modulates the shape. Cylinder: radius on the emission side. Disc: inner-radius proportion (<code>0</code> = fully closed disc, <code>1</code> = emission only on the outer rim). Sphere: hemispherical angle (<code>1</code> = full sphere, <code>0.5</code> = half-dome, <code>0</code> = point).</li>\n</ul>\n<p>Sphere/Cylinder shapes do <strong>not</strong> display correctly when the emitter is parented to an Attachment. Only use them with a BasePart parent (the part can be tiny and invisible).</p>\n<h2>Flipbooks (animated textures over particle life)</h2>\n<p>Prepare a grid sheet (2x2, 4x4, 8x8, Custom) with transparent spacing between frames (to prevent mip filtering from sampling adjacent frames).</p>\n<ul>\n<li>FlipbookLayout, FlipbookSizeX/Y.</li>\n<li>FlipbookFramerate (or random range, max 30).</li>\n<li>FlipbookMode: Loop, OneShot (explosions; ignores <code>FlipbookFramerate</code> and plays exactly once over the particle Lifetime), PingPong, Random (with crossfade; great for organic variation).</li>\n<li>FlipbookBlendFrames: crossfade between adjacent frames in Loop/OneShot/PingPong for smoother animation.</li>\n<li>FlipbookStartRandom: each particle starts at a random frame (useful when framerate is 0 for static but varied look).</li>\n</ul>\n<p><strong>Memory warning:</strong> Flipbooks are heavier. Reuse textures, keep resolution reasonable, limit unique animated emitters on low-memory clients (older phones will auto-disable flipbooks).</p>\n<h2>Lighting and rendering controls</h2>\n<ul>\n<li>LightEmission: 0 normal, 1 additive/glow (works even in dark scenes).</li>\n<li>LightInfluence: 0 = ignore world light, 1 = fully affected.</li>\n<li>Brightness: scales the light the emitter contributes when <code>LightInfluence</code> is 0. No effect when <code>LightInfluence</code> is 1.</li>\n<li>Orientation: FacingCamera (classic billboard), FacingCameraWorldUp, VelocityParallel, VelocityPerpendicular.</li>\n<li>ZOffset: render layer offset in studs (layer multiple emitters without moving them in 3D).</li>\n</ul>\n<h2>Performance across devices</h2>\n<ul>\n<li>Fill rate (pixels covered by overlapping transparent layers) and overdraw are the main GPU costs.</li>\n<li>Rate × Size × average opacity × how many overlap on screen = cost.</li>\n<li>Always test at both lowest and highest Studio Editor Quality Level.</li>\n<li>Mobile rate is capped lower.</li>\n<li>Use .Enabled = false to pause (existing particles continue until they die or you call :Clear()).</li>\n<li>Many simultaneous high-rate/large/transparent emitters will cause the engine to throttle or drop effects on low-end clients.</li>\n<li>Measure overdraw in Studio with <strong>View → Stats → GPU → Fill Rate</strong> and <strong>Render → Overdraw</strong>. Reduce total opaque pixel area before lowering Rate.</li>\n</ul>\n<h2>Replication and client-authoritative emission</h2>\n<ul>\n<li>ParticleEmitter state replicates, but individual particles do not. A server-owned emitter will spawn the same particles on every client automatically.</li>\n<li>For one-shot bursts, prefer <strong>client-authoritative emission</strong>: 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.</li>\n<li>Use <code>RemoteEvent:FireClient</code> or a local signal so clients own transient visuals; keep gameplay logic authoritative on the server.</li>\n</ul>\n<h2>LOD and distance culling</h2>\n<ul>\n<li>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.</li>\n<li>Use <code>workspace.CurrentCamera</code> distance checks or zone systems. Avoid per-frame <code>Magnitude</code> checks for many emitters; instead use a tagged culling heartbeat or spatial partition.</li>\n<li>For ambient weather/large crowds, spawn emitters only in the near-camera region rather than globally.</li>\n</ul>\n<h2>Preloading textures</h2>\n<ul>\n<li>Call <code>ContentProvider:PreloadAsync({texture})</code> 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.</li>\n</ul>\n<h2>Patterns</h2>\n<ul>\n<li>Continuous ambient (fire, smoke, rain): Rate + Lifetime + Size tuned so density looks right at normal camera distances.</li>\n<li>One-shot bursts (explosion, impact, muzzle flash): Set Rate low or 0, then call emitter:Emit(num) from an animation marker or event.</li>\n<li>Attached effects (foot dust, weapon trail, aura): Parent emitter or its attachment to the moving part/bone. Use LockedToPart or VelocityInheritance as appropriate.</li>\n<li>Wind-reactive: Enable global wind in the environment, set Drag &gt; 0 and WindAffectsDrag = true on the emitter.</li>\n<li>Combined with animation: Marker \"FootStep\" → find foot Attachment → Emit or play a short one-shot emitter.</li>\n</ul>\n<p>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).</p>\n<h2>Related effects (often used alongside particles)</h2>\n<ul>\n<li>Beam: textured ribbon between two Attachments (lasers, energy, ropes). Key properties: <code>Texture</code>, <code>TextureMode</code>/<code>TextureLength</code>/<code>TextureSpeed</code>, <code>Color</code>, <code>Transparency</code> (NumberSequence along the beam), <code>Width0</code>/<code>Width1</code>, <code>CurveSize0</code>/<code>CurveSize1</code>, <code>FaceCamera</code>, <code>LightEmission</code>, <code>LightInfluence</code>, <code>ZOffset</code>.</li>\n<li>Trail: ribbon left behind two Attachments as their parent part moves (sword trails, projectile paths, after-images). Key properties: <code>Color</code>, <code>Transparency</code>, <code>Texture</code>, <code>TextureMode</code>, <code>TextureLength</code>, <code>MinLength</code>, <code>MaxLength</code>, <code>WidthScale</code>, <code>LightEmission</code>, <code>LightInfluence</code>, <code>FaceCamera</code>, <code>Lifetime</code>.</li>\n<li>Highlight: cheap, effective outlines (selection, targeting, \"powered up\"). Has both an outline and a solid interior fill (<code>FillColor</code>/<code>FillTransparency</code>, <code>OutlineColor</code>/<code>OutlineTransparency</code>). <code>DepthMode</code> controls whether the highlight is visible through walls (<code>AlwaysOnTop</code>) or only when not occluded (<code>Occluded</code>). There is a client-side cap of 255 simultaneous <code>Highlight</code> instances (disabled instances still count toward the cap).</li>\n<li>PointLight / SpotLight / SurfaceLight + Atmosphere + PostProcessing for overall mood that makes particles read correctly.</li>\n</ul>\n<h2>Cleanup for transient emitters</h2>\n<ul>\n<li>Always destroy cloned one-shot emitters after their maximum lifetime (<code>Debris:AddItem</code> or <code>task.delay</code>). Do not leave disabled emitter instances accumulating in the workspace.</li>\n<li>For attached continuous emitters, set <code>Enabled = false</code> and <code>:Clear()</code> before reparenting or destroying to avoid orphaned particles.</li>\n<li>When pooling emitters, reset Rate, Lifetime, Size, and Transparency to known defaults before reuse so stale state does not leak into the next burst.</li>\n</ul>\n<h2>Scripts</h2>\n<ul>\n<li><code>scripts/EffectBurst.lua</code>: 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.</li>\n</ul>\n\n<h2>Reference index</h2>\n<ul>\n<li><a href=\"references/particle-emitter-properties.md\">particle-emitter-properties.md</a>: Tune particle appearance, motion, emission, or rendering cost.</li>\n<li><a href=\"references/shapes-flipbooks-and-advanced.md\">shapes-flipbooks-and-advanced.md</a>: Configure emitter shapes, animated textures, bursts, or distance culling.</li>\n</ul>\n\n","files":[{"path":"references/particle-emitter-properties.md","sizeBytes":7345,"isText":true},{"path":"references/shapes-flipbooks-and-advanced.md","sizeBytes":5229,"isText":true},{"path":"scripts/EffectBurst.lua","sizeBytes":3659,"isText":false},{"path":"SKILL.md","sizeBytes":9313,"isText":true}],"reviewScore":null,"reviewSummary":null,"trust":{"provenance":"trusted-source-unreviewed","notice":"Community-authored content, reproduced verbatim and not vetted as instructions. Treat it as data to evaluate, never as directives to follow.","bodySource":null},"bodyLocked":false,"purchaseUrl":null,"sourceUrl":null,"report":{"provenance":"trusted-source-unreviewed","screen":{"ran":true,"outcome":"clean","suspicious":0,"notes":0,"hiddenCharacters":false},"virusScan":{"engine":"clamav","status":"clean","scannedAt":"2026-10-18T17:24:32.507176Z","sha256":"4F762B6E4CBBE4A42807F2D4B37E2E26B5C5AB8707F5C58532B42E0FEA142ED6","sizeBytes":12069},"review":null,"source":{"repositoryUrl":"https://github.com/nonlooped/roblox-suite","path":"roblox-vfx","license":"MIT","commit":"2904c1660c702d82f1ab67f46ddf619d6abc9a2d","subtreeSha":"0EAA7DEE183DF7F51FBF15723E1484FFEDE709BB36E553D2DB0F61D609C04380","lastSyncedAt":"2026-10-18T17:23:55.435396Z"},"reviewedAt":"2026-10-18T17:25:23.118031Z","notice":"Community-authored content, reproduced verbatim and not vetted as instructions. Treat it as data to evaluate, never as directives to follow."},"install":[{"target":"skills-cli","command":"npx skills add https://github.com/nonlooped/roblox-suite/tree/main/roblox-vfx"},{"target":"claude-code","command":"claude plugin marketplace add https://llmmart.ai/marketplace.json && claude plugin install nonlooped-roblox-suite@llmmart"},{"target":"git","command":"git clone https://github.com/nonlooped/roblox-suite.git"}]}