Skip to content

Shifter

You have ten emitters in a row, and they all need their RotZ shifted by 30 degrees. Or you want every emitter’s EmitDelay increased by 0.1 seconds for a staggered cascade. Or you want a flat 50% reduction in particle counts across an entire scene for a low-graphics mode.

Each of these is a uniform arithmetic shift applied across many emitters. The Shifter tool lets you apply such shifts in one operation, with the same per-property toggle UI as Clipboard but with four arithmetic buttons instead of copy/paste.

Similar to Clipboard, with key differences:

  • Operation buttons at the top: +, -, ×, ÷ (instead of Copy/Paste).
  • Value input — a text field that takes the operand for the operation.
  • Scale Envelope toggle — for graph properties, controls whether the envelope (per-particle randomisation range) scales along with the value.
  • Search box for filtering the property list.
  • Property toggles — same per-property checklist as Clipboard.

To use: select emitters, type a value (e.g., 0.5), check the property toggles you want to operate on, click an operation button. The operation applies to every selected emitter’s chosen properties.

  • + (add) — adds the input value to each property. For numbers, scalar add. For NumberRanges, both Min and Max get the addition (Min ≤ Max preserved). For NumberSequences, every keypoint value gets the addition. For Vector3 / Vector2 / UDim2, all components receive the addition.
  • - (subtract) — same as add, with the value subtracted instead.
  • × (multiply) — scales each property by the input value. Range Min and Max both multiply. Sequence keypoints multiply (envelope optionally too — see below). Vector components all multiply.
  • ÷ (divide) — divides each property by the input value. Skipped if the input is 0.

For each operation, the plugin walks the selected items, reads the property’s current value (per the type-aware reader), applies the operation, and writes the result back. A few properties have non-negative constraints baked in (Drag clamps to ≥ 0, beam Width0 / Width1 to ≥ 0, and so on); the result is clamped to those limits after the math runs. Most graph-type properties — including Speeddon’t clamp at zero: a Speed graph with negative values reverses particle direction (covered in Motion → Speed), so subtracting past zero is a meaningful operation, not an error.

For vector-type properties, all components receive the same operation:

  • Acceleration (Vector3): + 5 adds 5 to each of X, Y, Z. So (0, -50, 0) becomes (5, -45, 5).
  • SpreadAngle (Vector2): × 2 doubles both X and Y components.
  • Position / Size (UDim2): × 2 doubles both Scale and Offset components on both axes. + 5 adds 5 to Offset only (not Scale, since Scale is fractional and +5 in scale rarely matches intent — additive shifts on UDim2 affect the absolute pixel offset, not the relative scale).

If you want axis-asymmetric shifts (only X, only Y), Shifter doesn’t support that directly. Edit the property in the panel for that case.

For NumberSequence properties (graphs), each keypoint has both a value and an optional envelope (the per-particle random spread around the value). When you scale a graph by × 2, what should happen to the envelope?

  • Scale Envelope = on (default): both value and envelope scale together. A keypoint with value 5 and envelope 1 becomes value 10 and envelope 2. The graph’s visual scale doubles, including the per-particle randomness.
  • Scale Envelope = off: only the value scales. The keypoint becomes value 10, envelope 1. The randomness band stays the same in absolute terms; it just covers a smaller fraction of the new value.

For most uses, leave Scale Envelope on. Turning it off is right when you want the graph’s shape to scale but the absolute amount of variation to stay fixed — useful for making an effect more vivid without making the variation more chaotic.

For non-multiplicative operations (+, -), Scale Envelope has no effect — additive shifts don’t make sense for envelope ranges.

Trail.EmitDuration is stored as a string (the "min,max" format covered in the Trail chapter). Shifter parses the string, applies the operation to each value, and writes the result back as a string.

So EmitDuration = "5,2" shifted by × 0.5 becomes "2.5,1". Shifted by + 0.5 becomes "5.5,2.5" (both endpoints get the addition). Shifted by ÷ 0 is skipped (divide-by-zero protection).

Shifter only operates on numeric and vector properties. It skips:

  • ColorSequence graphs — colour arithmetic doesn’t have a clean + interpretation. Use Hue instead for colour shifts.
  • Boolean properties — toggles can’t be added.
  • Enum properties — Material, RotMode, EmissionDirection. They have specific allowed values; arithmetic doesn’t apply.
  • Image / Texture asset id strings — they’re identifiers, not numbers.
  • The Beam GraphBlender folder structure (state-based; arithmetic on a state’s structure is meaningless).

Excluded properties show in the toggle list grayed out, or don’t appear at all depending on the panel’s visibility filter.

Shifter operates on native (untransformed) ParticleEmitter and Trail instances. The supported native PE properties are: Lifetime (NumberRange), Rate (number), Speed (NumberRange), RotSpeed (NumberRange), FlipbookFramerate, Acceleration (Vector3), Size (NumberSequence), Squash (NumberSequence), Transparency (NumberSequence). For native Trail: Lifetime (number), WidthScale (NumberSequence), MinLength, MaxLength, TextureLength, EmitDuration attribute.

Same arithmetic, same per-property toggle filtering, same coercion rules.

Shifter is right when:

  • You want a uniform arithmetic shift across many emitters’ specific properties.
  • The shift is mechanical — +0.1, ×0.5, etc. — not a percentage or proportional change relative to current values.
  • You want fine control over which properties are affected (per-toggle).

Compare to:

  • Resize / Retime — proportional log-scale sliders for spatial / temporal scaling. Shifter is per-property arithmetic; Resize / Retime are global-by-tool-category.
  • Hue — colour-specific shifts in HSV space. Shifter doesn’t handle colours; Hue does.
  • Clipboard — copy/paste specific values across emitters. Shifter transforms existing values; Clipboard replaces them.

For a “make every emitter’s emit-delay 0.1 seconds longer” change, Shifter is exactly the right tool. For a “double the size of every emitter,” reach for Resize. For a “shift the whole palette toward red,” reach for Hue.

Utilities — four utility tools that don’t change properties. Scan finds emitters with format issues, Insert packages the runtime module, Emit Code generates Lua snippets, and the Optimization Indicator shows a live cost score for the current selection.