Skip to content

PointLight

A PointLight doesn’t have a shape. It’s a glow that emanates from its parent’s location, lighting up the surrounding scene without any geometry of its own. It doesn’t fly, doesn’t spread, doesn’t have a size you’d measure in studs.

So a PointLight emitter is the simplest type in the plugin. Every emission produces a duplicate that stays parented to the same place as the source, animates three properties (Range, Brightness, Color) over its lifetime, and the engine destroys the duplicate when the time runs out. Six properties total in the panel, three of them graphs. That’s the whole surface area.

Any Roblox PointLight instance.

The PointLight’s parent — typically a Part — provides the position. The PointLight has no CFrame of its own (lights are conceptually points), so when the parent moves, the light moves with it for free. Each emitted duplicate inherits the same parent and follows the same path.

This is unlike the workspace types you’ve seen so far. There’s no Position graph, no Speed, no SpreadAngle — those are all about moving a particle through space, and a PointLight has no space-of-its-own to move through. It’s pinned to its parent.

What you get instead is property-only animation. At emission time, the plugin clones the source PointLight, applies the initial values from each graph, and parents the duplicate to the source’s parent. Each frame after that, the engine samples the three graphs at the duplicate’s current age and writes the values directly to Range, Brightness, and Color on the duplicate. When the duplicate’s Lifetime runs out, the engine destroys it.

The lights you emit don’t move, don’t roll, don’t spread. They pulse in place — one steady glow per duplicate, animating its three values, then gone.

The full surface area, grouped by panel section.

Panel labelData attributeTypeDefaultWhat it does
EnabledEnabled (attribute)booleanfalseMaster on/off
RateRatenumber10Lights emitted per second
LifetimeLifetimeNumberRange1Seconds each light lives, with random variation
Panel labelData attributeTypeDefaultWhat it does
RangePLRangeNumberSequence8Light radius graph, in studs
BrightnessPLBrightnessNumberSequence1Glow intensity graph
ColorPLColorColorSequencewhiteHue graph
ShadowsShadowsbooleanfalseWhether the light casts real-time shadows
Panel labelData attributeTypeDefaultWhat it does
Anim. StepsTotalKeyFramesnumber100Pre-sample resolution for the graphs
LingerPartLifenumber0Seconds the light stays visible after Lifetime expires
Emit IntoEmitParentInstancenilWhere the duplicates parent — overrides the default

That’s all of it. No Movement section, no Shape, no Flipbook, no GraphBlender. The other workspace types each had richer surfaces because they have geometry to control. PointLight has none.


A NumberSequence graph for the light’s radius, in studs. Range = 8 lights everything within 8 studs of the source.

A flash effect uses a graph that spikes high (say 30) at age 0 and decays to 0 by age 1 — a sudden burst of light fading quickly. A pulse uses an oscillating graph (the light grows and shrinks rhythmically). A charging light uses a graph that ramps from 0 upward — the light starts dark and grows bright over the lifetime.

The data attribute is named PLRange to avoid colliding with Roblox-native PointLight.Range. The plugin reads the panel value into PLRange and writes the sampled value to the duplicate’s Range each frame.

A NumberSequence for how intense the light is, multiplied against its base brightness. Values above 1 make the light glow more strongly; values below 1 dim it.

Combined with Range, Brightness controls how visible the light is from a distance. A high-brightness, short-range light is intense but localised. A low-brightness, large-range light is gentle but covers a wider area.

The data attribute is PLBrightness for the same disambiguation reason as Range.

A ColorSequence graph for the light’s hue. The most colourful PointLight effect uses a multi-stop colour graph that shifts through several tints over the lifetime — a fire-magic light might go from white at birth to orange mid-life to red at death.

For static-coloured lights, the graph is just a single colour at every keypoint.

The data attribute is PLColor.

A boolean. When true, the light casts real-time shadows in the scene; when false (the default), it doesn’t.

This is not a graph — a single value applied to the duplicate at emission and never animated. Roblox’s PointLight Shadows property is itself a boolean, not animatable. The plugin preserves this single-value model.

Shadows are expensive. A single shadow-casting light affects every nearby surface’s lighting calculation, and Roblox has a soft cap on how many shadow-casting real-time lights can be active at once. For most particle-style PointLights — magical orbs, projectile glows, brief flashes — leave Shadows off. Reach for it only on stationary effects (a glowing torch held by a stationary character) where the shadow is a deliberate part of the look.

An Instance field. By default, each emitted duplicate parents to the same parent as the source PointLight (typically a Part). Setting Emit Into to a different instance reparents emissions there — useful when you want the lights to outlive their source, or when you’re collecting all emitted effects in one folder for inspection.

For most uses, leave Emit Into empty. The default parent provides the position-tracking you usually want.


  • Brief flashes on moving objects. A muzzle flash, a sword-clash spark, a magic-cast burst. The light pulses for a fraction of a second and disappears.
  • Persistent ambient lights with motion. A magical orb whose colour pulses while orbiting a character. A torch whose flame brightness flickers to feel alive.
  • Glow on emitted particles. Drop a PointLight inside a Part emitter’s RenderTemplate, and each emitted Part-particle now carries a light with it. The light follows the particle through space; the PointLight emitter on its own doesn’t fly, but a PointLight nested inside a Part emitter rides the Part’s motion.

That third pattern is how you build glowing fireballs, ember-trails, and other “every particle is also a light” effects. It’s a Render Template composition, not a PointLight emitter directly. The PointLight emitter is for cases where the light itself is the visible effect, not a glow attached to something else.

A few PointLight-specific quirks.

Roblox has a soft limit on real-time light count. A typical Roblox engine budget is 8–16 simultaneous real-time lights affecting any given fragment, depending on hardware. Emit fifty PointLights per second in close proximity and some of them will silently not contribute to the lighting calculation — Roblox picks the closest or brightest and ignores the rest. If your emitted lights look “missing,” that’s likely why. Reduce Rate, lower Range, or stagger emissions across multiple parts.

The PL prefix on attribute names. PLRange, PLBrightness, PLColor — internal attribute names that don’t collide with PointLight’s native Range / Brightness / Color properties. The panel labels are the unprefixed versions; the prefix is internal and shows up only when you’re inspecting attributes through Studio’s Properties window or scripting against them.

Duplicates stay welded to the parent. The plugin doesn’t try to compute a position for emitted PointLights — they parent to the source’s parent and inherit that parent’s position. If the parent moves, the light moves; if it rotates, the light’s position rotates around the world origin if needed. There’s no Link Mode, no Pos. Mode, no offset graphs because there’s nothing to offset.

Enabled is split between source and RenderTemplate. Transform clones the source into a RenderTemplate first, then forces the source’s Enabled = false so it doesn’t render while you’re authoring. The RenderTemplate keeps the source’s pre-Transform Enabled (typically true), and every emitted duplicate inherits that — there’s no per-emit Enabled toggle in EmitPointLight, just the inherited value. Net result: emitted lights light up automatically; the source stays dark.

PointLight handed almost everything to Roblox — the positioning, the movement, the rendering. The next type goes the other direction. Model doesn’t have a single instance to clone; it has a hierarchy. A model is a folder of parts, attachments, scripts, and other instances arranged into a structured group. When you transform a Model, what does the engine emit — the whole hierarchy as one unit, or each piece separately? The answer involves a different cloning model than anything we’ve seen.