In the Inspector, each module appears as a section of the ParticleSystem component. In a .particle.json profile, the same module names are stored under modules so teams can review profile changes in version control when they need to.
Lenga uses familiar module names where that helps teams coming from other engines, but the current particle system is not a complete Unity Shuriken clone. The sections below describe what Lenga runs today and call out important limits so effects do not depend on controls that are still on the roadmap.
Main
The Main module controls the base simulation.
Important fields:
duration: length of one emitter cyclelooping: whether the emitter restarts after its durationprewarm: whether looping systems simulate one cycle before first renderplayOnAwake: whether playback starts when the scene startssimulationSpace:Local,World, orCustomwith a referenced scene object whose Transform defines the simulation spacedeltaTime:Scaledfollows the global time scale,Unscaledkeeps simulating through pauses and slow motionscalingMode: how Transform scale affects the effect —Hierarchy(full world scale),Local(the emitter's own scale), orShape(scale only affects spawn positions)emitterVelocityMode: whether emitter speed is measured fromTransformmovement or read from an attachedRigidbodystopAction:None,Disable, orDestroyapplied to the GameObject once a stopped system has no live particlesringBufferMode: keep particles alive until their pool slot is reused —PauseUntilReplacedholds their final state,LoopUntilReplacedloops their age insideringBufferLoopRangestartDelay: delay before the emitter begins its active cyclestartLifetime: how long particles livestartSpeed: initial speed at spawnstartSize: initial visual size, with an optional3Dtoggle for independent X, Y, and Z sizesstartRotation: initial rotation, with an optional3Dtoggle for independent X, Y, and Z rotationflipRotation: probability that a new particle spins in the opposite directionstartColor: color used when particles spawnsimulationSpeed: multiplier for simulation timemaxParticles: fixed pool sizerandomSeedandautoRandomSeed: deterministic playback controls
startDelay, startLifetime, startSpeed, startSize, startRotation, and startColor can be authored as constants, curves or gradients, random ranges, or random ranges between curves or gradients. Color fields also support a random-color mode that samples from a gradient palette.
flipRotation is a 0 to 1 probability. Use 0 when every particle should
keep the authored rotation direction, 1 when every particle should spin the
opposite way, and values between those when sparks, debris, or stylized motes
need mixed spin directions. When rotation is flipped, every rotation axis is
mirrored together.
The 3D toggles on startSize and startRotation switch between one uniform
value and independent X, Y, and Z values. Both authored representations are
kept, so switching back and forth never discards values. A scalar rotation
always means rotation about the z axis, which is what 2D quads and billboard
roll use; X and Y rotation tilt 3D billboards and become fully visible once
oriented mesh particles are supported.
Use Main first. If an effect feels wrong, lifetime, speed, size, simulation space, and max particles are usually the first values to inspect.
Emission
The Emission module controls how particles are created.
Important fields:
enabledrateOverTimerateOverDistancebursts
rateOverTime emits particles while the system is playing. rateOverDistance emits as the emitter moves. Both fields use the shared scalar editor, so they can be constants, curves, random ranges, or random ranges between curves.
Bursts create particles at specific times. Each burst row has:
Time: when the burst happens within the emitter cycleCount: how many particles to emit, using the same scalar modes as other particle valuesCycles: how many times the burst repeatsInterval: seconds between repeated burst cyclesProbability: the chance that the burst fires when it is due
Use Probability for variation, such as sparks that only sometimes split off from the main effect. Use Cycles and Interval for short repeated pulses without adding multiple identical rows.
Shape
The Shape module controls where particles spawn and which direction they start moving.
Supported shape data includes:
PointLine(Unity calls thisEdge; both names load)CircleRectangleCone2DSphereHemisphereBoxCone3DDonut: a torus whereRadiusis the ring,Donut Radiusthe tube, and radius thickness samples inside the tube; the arc modes walk the ring.Mesh Renderer: emits from a referenced MeshRenderer's vertices, edges, or triangles, optionally offset along the surface normal (Normal Offset) and tinted by vertex colors (Use Mesh Colors). Missing references fall back to point emission safely. Triangles are chosen uniformly by index; volume emission and material-index filtering are not offered because the mesh data cannot support them honestly.Sprite Renderer: emits across a referenced SpriteRenderer's world rectangle, honoring sprite-sheet source rects.
Shape fields include angle, spread, radius, radius thickness, arc, arc mode, arc spread, arc speed, length, emit-from mode, box size, local position, local rotation, local scale, align-to-direction, direction randomization, spherize direction, and position randomization.
Rectangle and Sprite Renderer sources can additionally use a Mask Texture: spawn points are rejected while the selected channel (Red/Green/Blue/Alpha) sits at or below Mask Threshold, and Mask Tints Color multiplies the sampled pixel into each particle's start color. Masking rejection-samples a bounded number of attempts per spawn so emission never stalls on sparse masks.
Use the Shape module for directional effects such as sparks and muzzle flashes. A narrow Cone2D or Cone3D, low radius thickness, and Align To Direction can produce a tight spray that reads clearly in motion.
When a particle system is selected, the scene view draws a wireframe outline of the emitter shape (including the shape's local offset, rotation, and scale) so you can see exactly where particles will spawn. The 2D scene view draws a flat outline; the 3D scene view draws the full wireframe for volumetric shapes such as Sphere, Box, and Cone3D. A shape with zero radius or size has no extent to outline, so switching shape types in the inspector seeds visible default sizes when the current values are degenerate.
Velocity Over Lifetime
Velocity Over Lifetime adds velocity as particles age. Use it when the particle should drift after spawn rather than only using its start speed. The linear values are a velocity, not an acceleration: they move particles directly and never build up. For accelerating motion use Force Over Lifetime.
Linear X/Y/Z: velocity added along each axis, inLocal(emitter) orWorldaxes depending onSpace.Orbital X/Y/Z: angular velocity in degrees/second around the orbit center (the emitter position plusOffset). OrbitingZis the classic 2D swirl.Radial: velocity away from the orbit center — positive expands, negative attracts.Speed Modifier: multiplies each particle's whole frame velocity (its own motion plus this module's), so a curve here can freeze or burst entire effects.
Examples:
- smoke drifting sideways
- magic motes orbiting subtly
- rain blown by wind
Inherit Velocity
Inherit Velocity makes particles pick up a proportion of the emitter's own movement in Lenga's current runtime. Initial bakes the emitter velocity into each particle at spawn; Current keeps following the emitter's velocity as it changes. The Multiplier controls the proportion and can be a curve.
This module only affects systems that simulate in World space — in Local space particles already move with the emitter.
Use it for exhaust trails on moving vehicles, dust kicked up behind a runner, or any effect that should "carry" the motion of its source.
Unity uses this module mainly for sub-emitters inheriting the parent particle's velocity. That parent-particle inheritance path is planned for Lenga's sub-emitter parity work; today, author this module as emitter-transform velocity.
Lifetime By Emitter Speed
Lifetime By Emitter Speed scales the start lifetime of each new particle by a multiplier curve sampled from the emitter's speed, normalized between speedRangeMin and speedRangeMax.
Use it to keep trails compact at high speed: the faster the emitter moves, the shorter each particle lives.
Force Over Lifetime
Force Over Lifetime applies acceleration-like motion while particles live.
Use it for gravity, lift, wind, or pull.
Examples:
- sparks falling downward
- smoke rising upward
- leaves blown sideways
gravityModifier is a scalar value, so it can be a constant, a curve, a random range, or a random range between curves. Gravity always pulls along the world down axis, even for rotated systems simulating in local space.
Space chooses whether the force is applied along the emitter's axes or world axes. Random force ranges pick one stable value per particle from its seed; enable Randomize to re-roll the force every frame for jittery, energetic motion.
Color Over Lifetime
Color Over Lifetime multiplies each particle's start color by a color value from birth to death. It can be a constant color, a gradient, a random range between two colors, a random range between two gradients, or a random color sampled from a gradient palette.
Use it for:
- alpha fade-out
- heat shifting from white to orange to red
- smoke becoming lighter as it dissipates
- magic changing hue over time
For most effects, the final gradient key should have alpha 0 unless particles are meant to pop off sharply.
Color By Speed
Color By Speed multiplies particle color by a gradient sampled from the particle's current speed, normalized between speedRangeMin and speedRangeMax. It stacks with Color Over Lifetime.
Use it to make fast sparks burn white-hot while slow ones cool to red, or to fade particles out as they decelerate.
Size Over Lifetime
Size Over Lifetime multiplies each particle's start size as it ages.
Common patterns:
- dust grows while fading
- sparks shrink while fading
- smoke grows slowly
- raindrops stay nearly constant
The Start Size and End Size inspector fields write a simple size curve for compatibility with existing effects.
Separate Axes switches the multiplier to independent X, Y, and Z values so an effect can, for example, stretch vertically while thinning horizontally. The uniform value is kept when toggling.
Size By Speed
Size By Speed multiplies particle size by a curve sampled from the particle's current speed, normalized between speedRangeMin and speedRangeMax. It stacks with Size Over Lifetime and supports the same Separate Axes mode.
Use it to stretch the visual energy of an effect: fast debris reads bigger, slow drifting motes read smaller.
Rotation Over Lifetime
Rotation Over Lifetime spins particles as they age.
This is useful for textured particles where repetition would be obvious. Even a small random rotation can make dust, leaves, embers, and spark textures feel less tiled.
Separate Axes switches the angular velocity to independent X, Y, and Z values. The uniform value always means rotation about z, which is what 2D quads and billboard roll display.
Rotation By Speed
Rotation By Speed spins particles at an angular velocity sampled from the particle's current speed, normalized between speedRangeMin and speedRangeMax. It adds on top of Rotation Over Lifetime and supports the same Separate Axes mode.
Use it for tumbling debris or rolling chunks that should spin faster the faster they fly.
Noise
Noise perturbs particle motion with smooth, deterministic turbulence. Strength is a value over lifetime in simulation units per second (with an optional Separate Axes mode for per-axis strength), Frequency controls how quickly the turbulence changes over a particle's life, Octaves layers finer detail at extra cost (Octave Multiplier and Octave Scale tune the falloff and growth), and Scroll Speed drifts the noise field over time so even slow particles keep wandering.
Quality trades cost for richness: Low shares one noise channel across axes, Medium samples two, and High samples all three independently. Damping scales strength inversely with frequency so high-frequency noise stays subtle; it is off by default so existing effects keep their look. Remap reshapes the raw noise value through a curve.
The three amount fields route one shared noise sample into different outputs: Position Amount moves particles, Rotation Amount spins them (degrees per second), and Size Amount modulates render size fractionally.
Each particle follows its own noise path derived from its random seed, so seeded systems stay reproducible.
Use it for organic motion such as smoke, fire, magic, dust, or insects. Noise-heavy effects are more expensive and should be tested with realistic particle counts.
Limit Velocity
Limit Velocity caps particle speed and can dampen motion.
Speed is a value over lifetime; Dampen controls what fraction of the excess is removed each frame. Separate Axes clamps each axis independently in the module's Space (Local or World). Drag slows particles before clamping, optionally multiplied by particle size and/or current speed so large or fast particles lose more energy.
Use it when force, velocity, and noise combine into speeds that make the effect unreadable.
Module Evaluation Order
Combined motion stays predictable because modules always evaluate in one documented order each simulation step:
Velocity Over Lifetimesamples its module velocity (linear, orbital, radial).Force Over Lifetimeand gravity integrate into the particle's velocity.Limit Velocityapplies drag, then clamps.- The particle moves by its own velocity plus the module velocity, scaled by
Speed Modifier. Noiseperturbs position and rotation.Inherit Velocity(Currentmode) drifts position.Collision, thenTriggers.Rotation Over LifetimeandRotation By Speedspin the particle.- Trails record the final position.
Color and size (... Over Lifetime / ... By Speed) are resolved at render time from the final state.
Texture Sheet Animation
Texture Sheet Animation picks frames from a sprite sheet over particle lifetime.
Use it for:
- flipbook smoke
- animated fire
- spark variation
- stylized impact flashes
Mode selects where frames come from. Grid treats the renderer texture as a Tiles X by Tiles Y grid of equally sized frames, where Animation plays the whole sheet or a single row. Sprites plays a curated, ordered list of sprite assets instead; add or remove slots and pick the sprite for each slot directly in the inspector.
Time Mode chooses how frames advance: Lifetime samples the frame-over-time curve against particle age (optionally repeated with Cycles), Speed Range maps particle speed to a frame, and FPS advances frames at a fixed rate. Start Frame (or Random Start Frame) offsets where each particle begins so particles do not all display the same frame.
Intentional differences from Unity's module: a mesh-index row mode and UV channel selection are not offered yet, because Lenga particles do not have per-particle mesh indices or multiple renderer UV streams. Both arrive with the mesh rendering and material work rather than as inert controls here.
Collision
The Collision module deflects particles when they hit configured particle collision surfaces.
Use Planes when an effect should collide with an authored plane such as a floor, wall, or shield surface. Use World Colliders when the particles should collide with the scene physics world.
Important settings:
Typechooses no collision, plane collision, or world-collider collision.Collides Withchooses which GameObject layers world-collider particles can hit.Bouncecontrols how strongly particles rebound.Dampingreduces sideways motion after impact.Lifetime Lossshortens particles when they hit.Radius Scaleadjusts the particle collision radius.Min Kill SpeedandMax Kill Speedkill particles whose speed after the collision response falls below or above the limits.Planesreferences scene objects whose Transforms define collision planes (position plus rotated up axis). The authoredPlane NormalandPlane Distanceapply when the list is empty; missing references are skipped safely.Send Messagesrecords bounded per-frame collision events that scripts poll withgetCollisionEvents().
Intentional differences from Unity: there are no collision-quality or
cached-collision tiers (every live particle sweeps every frame — watch the
collisionQueries profiling counter instead), queries return the first
blocking hit, and collider-force output is not available yet.
Trails
Trails makes each particle leave a fading ribbon of its recent path.
Important settings:
mode:Particlesgives each particle its own path history;Ribbonconnects the live particles to each other in stable spawn order — useful for lightning, chains, and streamers.ratiois the fraction of particles that record a trail; selection is deterministic per particle.lifetimeis how long (in seconds) each recorded trail point survives before fading out.dieWithParticles(default on) removes a particle's trail when it dies; turn it off to let recorded points fade out naturally.widthis the trail thickness in simulation units.widthOverTrailmultiplies width from the trail head (new) to the tail (old); curves are supported in the module data.colorOverTrailmultiplies color along the trail the same way.sizeAffectsWidth/sizeAffectsLifetimemultiply width or lifetime by the particle's largest start-size axis.minVertexDistanceis how far a particle must travel before a new point is recorded; larger values produce coarser, cheaper trails.inheritParticleColormultiplies the trail color with each particle's start color.colortints the whole trail; alpha fades along the trail with point age.
Each particle keeps a bounded number of trail points, so cost scales with Max Particles. Trail segments currently render as unlit lines; textured ribbon strips, trail materials, ribbon counts above one, and trail lighting/shadow controls arrive with the render batching work.
Sub Emitters
Sub Emitters let one particle system spawn particles on another particle
system in response to particle events. Use this when a particle should create
a secondary effect, such as sparks that leave tiny smoke puffs when they die,
fireworks that spawn glitter at birth, or debris that creates a dust pop when
it expires.
Each slot has:
Event:Birth,Death, orManual.Birthemits continuously across each parent particle's lifetime using the target system's emission rates (rate over time plus rate over distance measured from parent movement), and additionally burstsEmit Countparticles the moment a parent spawns.DeathburstsEmit Countparticles when a parent dies, including when a ring-buffer particle is finally replaced.Manualslots fire only when a script callstriggerSubEmitter().CollisionandTriggerare visible but disabled until the collision-event and trigger-event phases of the particle roadmap.Target: a GameObject in the same scene that has aParticleSystemcomponent. You can pick it from the field or drag a ParticleSystem GameObject from the Hierarchy.Emit Count: how many particles the target system emits per event.Emit Probability: how likely the slot is to fire when the event occurs. A value of0never fires; a value of1always fires.Inheritflags: what spawned particles take from their parent particle.Colormultiplies the child's start color by the parent's current color,Sizemultiplies the child's start size by the parent's current size,Rotationadds the parent's roll, andLifetimescales the child's lifetime by the parent's remaining lifetime fraction.
Positions and velocities convert correctly between the two systems'
simulation spaces, so a world-space parent can feed a local-space child and
vice versa. When the target's Inherit Velocity module is enabled, its
Initial mode adds the parent particle's velocity at spawn and its Current
mode keeps following the parent's live velocity while the parent exists,
falling back to the captured velocity afterwards.
To keep effects predictable and avoid runaway chains, particles spawned by a sub emitter do not generate additional sub-emitter events, and each system dispatches at most a bounded number of sub-emitter particles per frame (counted in the profiling counters when exceeded). Child burst rows are not yet applied per parent particle during Birth emission.
Triggers
Triggers let particles react to entering or leaving referenced collider
volumes. Reference up to 32 scene objects with colliders; each particle
tracks which of them it is inside using one overlap query per particle per
frame (radius = particle radius times Radius Scale).
Each of the four conditions — Inside, Outside, Enter, and Exit —
chooses an action:
Ignore: nothing happens.Kill: the particle dies through the normal death path (Death sub emitters fire).Callback: a bounded per-frame trigger event is recorded; scripts poll them withgetTriggerEvents().
Trigger sub-emitter slots fire when a particle enters any referenced collider. Missing or inactive collider references are skipped safely, and each referenced collider's own scene gizmo shows the effective bounds.
External Forces
External Forces lets scene-authored Particle Force Field components push
particles around. Add a Particle Force Field component to any GameObject
(Effects group in Add Component); its Transform places and orients the
field.
Each field offers:
Shape:Sphere(influence ramps from full strength atStart Rangeto zero atEnd Range) orBox(full strength inside the orientedBox Size).Direction: a constant force along the field's local axes.GravityandGravity Focus: pull toward the focus shell — focus0targets the field center,1targets the end-range shell, letting you build rings and orbits.Rotation Speed,Rotation Attraction,Rotation Randomness: a vortex around the field's up axis (zin 2D). Attraction pulls existing velocity onto the orbit; randomness tilts each particle's vortex axis deterministically from its seed.Drag, optionally multiplied by particle size and/or speed.
On the particle system, the External Forces module chooses which fields
apply: Influence Filter selects by GameObject layer mask or an explicit
field list, and Multiplier scales all field influence. Fields are gathered
once per frame per system and every particle-field evaluation shows up in
the profiling counters, so field-heavy scenes stay measurable. Vector-field
textures are not offered yet; the runtime contract is ready for them once
volume textures land.
Lights
Lights lets a fraction of particles contribute real point lights to the
scene — fire embers that glow on nearby walls, magic sparks that light a 2D
dungeon. Lights are transient: the renderer owns them for exactly one frame
and no Light components are ever created in the scene.
Light: a scene object whosePoint Light(3D systems) orPoint Light 2D(2D systems) component acts as the light template. Lenga references a scene object here rather than a prefab asset; disable the template object if you do not want the template light itself to render. With no reference the module falls back to a default white light (intensity 1, range 8).Ratio: the fraction of particles that carry a light, from0to1.Random Distribution: on, each particle rolls against the ratio using a stable per-particle hash; off, lights follow a regular every-Nth-particle cadence that produces the exact fraction. Both modes are deterministic for a fixed seed.Use Particle Colormultiplies the template color with the particle's current rendered color, so lights inherit Color over Lifetime and Color by Speed exactly as drawn.Size Affects Rangemultiplies the light range by the particle's largest rendered size axis;Alpha Affects Intensityscales intensity with the particle's current alpha — useful for lights that fade with the particle.Range MultiplierandIntensity Multiplierscale the template values.Max Lights: the per-system budget. Selection walks live particles in stable order, so which particles keep their lights never flickers between frames; lights beyond the budget are counted in the profiling stats as dropped.
Path-specific limits, stated honestly: the 3D lit shader exposes four point-light slots in total, and particle lights only fill slots that scene-authored Point Lights leave free — treat 3D particle lights as an accent, not a crowd. The 2D path accepts up to 64 transient lights per frame and particle lights never cast 2D shadows. The isolated particle preview panel does not run scene lighting; use the scene or game view to judge light behavior.
Performance and Determinism
Every hard limit is a documented constant, so effects fail predictably
instead of growing unbounded: the particle pool is fixed at
Max Particles; sub-emitter events cap at 256 per frame with 512 spawned
particles per frame; contact events cap at 256 per frame; trails keep at
most 64 points per particle; transient particle lights cap at 64 (2D) and
the lit shader's four point-light slots (3D). When a budget saturates, the
overflow is counted, not leaked — read the frame stats
(aliveParticles, lastSimulationMilliseconds, lastRenderSubmissions,
lastRenderBatchesEstimate, lastTransientLightSubmissions, dropped
counters) to find which budget you are hitting.
Batching: submissions that share a texture merge into one GPU batch, so a
4,000-particle same-texture system is a handful of draw calls. Texture
switches (sprite-mode sheets with many source textures) split batches;
lastRenderBatchesEstimate near your particle count means state churn is
defeating batching.
Determinism: with Auto Random Seed off, a fixed seed replays the exact
same simulation across runs, restarts, and machines — selection of lit
particles, trail carriers, and custom-data randomness all key off stable
per-particle ids. Anything driven by variable frame time (camera-scale
stretch, editor preview stepping) is reproducible under a fixed timestep.
Troubleshooting
- Nothing renders in the scene view: check the
FXchip in the scene toolbar (it persists across sessions) andShow Only Selectedin the preview panel. A disabled Renderer module draws nothing anywhere. - Trails but no particles:
Render ModeisNone— intended for trails-only effects. - Particles vanish early under heavy emission: the pool is recycling;
raise
Max Particlesor useRing Buffer Mode.poolExhaustedSpawnsin the frame stats confirms it. - Sub-emitters stop spawning in dense scenes: per-frame event and
spawn budgets are saturating; check
droppedSubEmitterEvents. - 3D particle lights don't appear: the lit shader has four point-light slots total and scene lights fill them first.
- Custom-data shader has no effect: the material needs a shader asset; judge it in the scene or game view — the isolated preview panel does not apply materials.
- Effect looks different between editor preview and game: geometry is shared and cannot drift; shading differences (scene lighting, custom shaders, particle lights) are listed in the scene-view parity audit.
Custom Data
Custom Data hands authored per-particle values to custom particle
materials, so advanced shaders (dissolves, distortion, per-particle
variation) can consume data the simulation controls.
Two channels are available, Custom 1 and Custom 2. Each channel is
either a Vector (up to four components, each a full scalar value —
constant, random-between, or curves sampled over the particle lifetime) or
a Color (constant, gradient, or random-between, packed as normalized
rgba). Random modes are stable per particle, so replays are deterministic.
Shader authors: assign a material whose shader asset is a custom particle shader. Each particle's channels arrive as uniforms set before its draw:
uniform vec4 particleCustom1;
uniform vec4 particleCustom2;
// example: dissolve driven by custom1.x, tint by custom2.rgb
void main()
{
vec4 base = texture(texture0, fragTexCoord) * fragColor;
if (base.a < particleCustom1.x) discard;
finalColor = vec4(base.rgb * particleCustom2.rgb, base.a);
}
The particle's resolved color still arrives through the standard vertex color. Notes, stated honestly: values are per-draw uniforms (not vertex streams), so extremely large systems pay one uniform update per particle; Lenga colors are 8-bit, so author HDR-style intensities through Vector mode; the isolated particle preview panel does not apply materials — judge custom shaders in the scene or game view.
Renderer
The Renderer module controls how particles draw.
Important fields:
renderMode:Billboard,StretchedBillboard,HorizontalBillboard,VerticalBillboard,Mesh, orNone(particles emit no geometry — useful for trails-only effects).renderAlignment(Billboard and Stretched Billboard):Viewfaces the camera plane,Worldlocks to world axes,Localfollows the emitter's rotation,Facingpoints at the camera position, andVelocityorients each particle along its motion.allowRoll: off strips the particle's roll from camera-facing billboards; x/y tilt still applies.blendModesortMode:Nonekeeps spawn order;OldestInFront/YoungestInFrontorder by stable particle age;Distancedraws far-to-near from the active 3D camera (2D keeps spawn order). All modes are deterministic — ties break on the particle id, so ordering never flickers.texturePathmaterialPath: the material's base color tints all particles and its base texture is used when no explicit texture is set. Lit/custom shader modes and trail materials are not yet applied to particles (planned with batching and ribbon trails).meshPath(Mesh mode): loads a model asset; a multi-mesh model distributes its meshes across particles deterministically. Without an asset, the selected primitive shape draws instead.receiveShadows: the system's world polygon receives baked 2D shadows like any other 2D renderer. Particles do not cast shadows.stretchLengthScale,stretchSpeedScale, andstretchCameraScale(camera movement adds streak length)freeformStretching: keeps stretched quads camera-facing by rotating toward the on-screen velocity, so streaks never collapse when moving toward the camera.minParticleSize/maxParticleSize: viewport-height fractions that clamp billboard sizes under a 3D camera (0disables a clamp). 2D sizes are authored in pixels and are not clamped.sortingLayerorderInLayerlightingEnabledreceiveShadowspivotflipXandflipY
For 2D, sorting layer and order are often the most important renderer values. For 3D, render mode, particle size, texture alpha, and camera distance usually matter most.
Use StretchedBillboard when particles should read as streaks, such as rain, sparks, debris trails, or speed lines. stretchLengthScale gives every particle a base streak length, while stretchSpeedScale adds more length from particle velocity.