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.
What it transforms
Section titled “What it transforms”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.
The model
Section titled “The model”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.
Properties at a glance
Section titled “Properties at a glance”The full surface area, grouped by panel section.
Spawning
Section titled “Spawning”| Panel label | Data attribute | Type | Default | What it does |
|---|---|---|---|---|
| Enabled | Enabled (attribute) | boolean | false | Master on/off |
| Rate | Rate | number | 10 | Lights emitted per second |
| Lifetime | Lifetime | NumberRange | 1 | Seconds each light lives, with random variation |
Appearance
Section titled “Appearance”| Panel label | Data attribute | Type | Default | What it does |
|---|---|---|---|---|
| Range | PLRange | NumberSequence | 8 | Light radius graph, in studs |
| Brightness | PLBrightness | NumberSequence | 1 | Glow intensity graph |
| Color | PLColor | ColorSequence | white | Hue graph |
| Shadows | Shadows | boolean | false | Whether the light casts real-time shadows |
Advanced
Section titled “Advanced”| Panel label | Data attribute | Type | Default | What it does |
|---|---|---|---|---|
| Anim. Steps | TotalKeyFrames | number | 100 | Pre-sample resolution for the graphs |
| Linger | PartLife | number | 0 | Seconds the light stays visible after Lifetime expires |
| Emit Into | EmitParent | Instance | nil | Where 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.
Per-property prose
Section titled “Per-property prose”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.
Brightness
Section titled “Brightness”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.
Shadows
Section titled “Shadows”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.
Emit Into
Section titled “Emit Into”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.
What you’d reach for it for
Section titled “What you’d reach for it for”- 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.
Worth knowing
Section titled “Worth knowing”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.
What’s next
Section titled “What’s next”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.