Skip to content
Connecting DocsDocumentation
Main website

Connecting Docs

TUNS

Version 1.1.0

What TUNS does

TUNS: True Uniform Niagara Sampling gives Niagara a true uniform field of sample points with optional baked masking for both Skeletal and Static meshes.

  1. Bake: choose a mesh and an optional mask texture, then click Bake for TUNS to distribute the samples
  2. Connect: assign the saved bake to a TUNS Baked Surface (GPU) input in your Niagara module either on Particle Spawn or Particle Update.
  3. Use: the sampling module writes position, normal, UV and other surface attributes for your effect.
Random triangle sampling on the left; a freshly GPU-baked TUNS bank on the right. 65,536 active particles per mesh.
Random triangle sampling on the left; a freshly GPU-baked TUNS bank on the right. 65,536 active particles per mesh.

Baking is an editor step. At runtime, Niagara reads the saved bank on the GPU.

Start with your first effect.

Quick setup for Static Meshes

1. Sample & Bake a mesh

  1. Right-click → Miscellaneous → Data Asset. Choose TUNS Surface Bake. for this example we will name it DA_TUNS_Sphere.
  2. Open it. Set your preferred Mesh, Leave Mask Texture empty and UV Channel = 0.
  3. Set Sample Bank Size = 1,024, Relaxation Iterations = 64 and Integration Samples Per Point = 32.
  4. Click TUNS Bake. Confirm Ready in Status and Sample Count = 1,024. Save.
Bake, inspect the points and confirm the result in the surface-bake editor.
Bake, inspect the points and confirm the result in the surface-bake editor.
  1. TUNS Bake
    Build and bake down the sample points.
  2. Preview limit
    Only controls the dots drawn in the editor.
  3. Status
    Ready means the bake can now be used in Niagara

2. Connect Niagara

  1. Navigate to Plugin content and duplicate the Niagara System into your project: Content/Examples/Systems/NS_TUNS_Comparison_SM
  2. Open the duplicate. Disable Before; keep TUNS enabled.
  3. In User Parameters, expand BakedSurface. Set Surface to DA_TUNS_Sphere.
  4. Set SampleBudget = 1,024 and Flow = 0. SamplingData is already linked to User.BakedSurface.
  5. Compile and save. The preview should show dots covering the sphere. Drag the system into your level and test Play.
Assign the baked Data Asset to the Surface field.
Assign the baked Data Asset to the Surface field.
  1. Surface

    Choose the bake, not the source mesh or mask texture.

For a production emitter, follow the static-mesh setup.

Create a surface bake

  1. Create a TUNS Surface Bake Data Asset in your project.
  2. Choose the exact Mesh you plan to use. Static and skeletal assets are supported; the baker uses LOD 0.
  3. Choose a valid UV Channel. Add a Mask Texture if only part of the surface should emit.
  4. Choose a bank size. Start with 64 relaxation iterations and 32 integration samples per point.
  5. Click TUNS Bake, inspect the result and save.
Source and quality fields for a small bank.
Source and quality fields for a small bank.
  1. Mesh

    The LOD 0 surface to bake.

  2. Optional mask

    Leave empty for the full surface.

  3. Bank size

    Reusable points; Niagara controls live particle count.

A skeletal bake stores locations on triangles in the reference pose. The skeletal Niagara input resolves those locations against the matching mesh. A static bake also stores positions and normals.

A cancelled or failed bake retains previous data. That does not mean it matches your new settings; check Status and Is Ready.

Paint and tune a mask

  1. Paint using the mesh’s UV layout: black excludes an area; brighter values attract more samples.
  2. Assign Mask Texture and the matching UV Channel.
  3. Set Mask Channel: 0 = Red, 1 = Green, 2 = Blue, 3 = Alpha.
  4. Use Invert to swap high and low values. Threshold excludes values at or below its cutoff.
  5. Use Power to shape relative density. Values above 1 favor bright regions; values below 1 give darker regions more weight. Rebake.
Mask controls for the supplied half-surface mask.
Mask controls for the supplied half-surface mask.
  1. Mask Texture

    Paint for this mesh’s UV layout.

  2. UV Channel

    The UV set on the mesh.

  3. Mask Channel

    0 is Red; 3 is Alpha.

  4. Threshold

    Exclude faint values.

  5. Power

    Shape density in the remaining region.

MaskResult
None / whiteFull available surface
BlackNo valid sample locations
Black and whiteThe bank concentrates in white areas
Uniform gray above thresholdStill a full bank; gray is weight, not a count control
GradientMore points in brighter areas

The baker reads mask values as linear data from the source image, with bilinear sampling and UVs clamped to 0–1. It does not modify source texture compression or streaming settings.

Bank size and bake quality

SettingUse
Sample Bank Size256–262,144 points; rounded up to a power of two.
SeedChanges the baked distribution. Requires a rebake.
Relaxation Iterations1–256 surface-spacing passes. Start at 64.
Integration Samples Per Point8–128 integration samples per bank point. Start at 32.
Bake quality and the resulting sample count.
Bake quality and the resulting sample count.
  1. Bank capacity

    More saved points enlarge the atlas.

  2. Relaxation Iterations

    64 in these examples.

  3. Integration Samples Per Point

    32 in these examples.

Choose enough points for the unique locations you need. A 65,536-point bank supports 65,536 sequential sample indices before wrapping. More particles reuse locations; they do not create more spacing.

Progressive ordering gives useful coverage when you use fewer points. More bake work can improve spacing until convergence, but does not guarantee mathematically identical distances.

Inspect the preview

  1. Click Frame Mesh. Use Alt + left drag to orbit, middle drag to pan and the wheel to zoom.
  2. Enable Points. X-ray shows points behind the surface.
  3. Set the preview limit beside X-ray to 65,536 to inspect an entire bank of that size.
  4. Under Preview, choose Opaque Black or Translucent if the supplied mesh material hides points.
  5. Adjust Point Surface Offset only to make preview dots easier to see.
Preview controls do not change the bank or Niagara particle count.
Preview controls do not change the bank or Niagara particle count.
  1. Frame Mesh

    Fit the mesh in view.

  2. Points

    Show or hide dots.

  3. X-ray

    See points through the surface.

  4. Preview limit

    Set this to the bank count to display every point.

Material and point-offset settings affect only the editor preview.
Material and point-offset settings affect only the editor preview.
  1. Mesh Material

    Supplied, opaque black or translucent.

  2. Point Surface Offset

    Use Niagara’s NormalOffset for the actual effect.

Preview Vanilla shows random triangle sampling. Preview Equal Vanilla shows surface-area-weighted random sampling. Both apply mask rejection; neither applies spacing relaxation. Click the active button again to return to TUNS.

Combine several bakes

  1. Bake at least two assets using the same mesh and UV channel. Different masks are useful here.
  2. Create a separate destination bake. Set its Mesh and UV Channel first.
  3. Add the ready source assets to Combine Sources.
  4. Click Combine Bakes. Confirm the combined Sample Count and Ready status.
  5. Assign the destination to Niagara’s Surface field.
Two 1,024-point banks become a 2,048-point destination.
Two 1,024-point banks become a 2,048-point destination.
  1. Sources

    Current bakes for this mesh and UV channel.

  2. Combine Bakes

    Pack all source points.

  3. Sample Count

    The sum of the source counts.

Combining preserves positions and weights and interleaves banks proportionally. It does not relax spacing or remove duplicates between banks. Overlapping regions remain denser. Source assets are unchanged.

Maximum combined bank: 1,048,320 points. Self references, duplicate sources, stale sources and cycles are rejected. The destination’s Sample Bank Size does not choose the combined count.

Static-mesh emitter

1. Prepare the emitter

  1. Create a Niagara System with an editable emitter and a Sprite Renderer. Start with Spawn Burst Instantaneous → Spawn Count = 1,024.
  2. Select Emitter Properties. Choose GPU Compute Sim, enable Local Space, and set Fixed Bounds large enough to contain the mesh and effect.
  3. Keep Initialize Particle in Particle Spawn. Use a small sprite size, a visible color and enough lifetime to inspect the effect.
Set these emitter properties before adding TUNS.
Set these emitter properties before adding TUNS.
  1. Local Space

    Positions are relative to the Niagara component.

  2. GPU Compute Sim

    TUNS sampling runs on the GPU.

  3. Fixed Bounds

    Include the full mesh and any particle movement.

2. Connect the baked surface

  1. Create and populate User.BakedSurface with your static bake.
  2. Under Particle Spawn, add TUNS_SampleStaticMesh after Initialize Particle. Search TUNS; enable plugin/library content if it is filtered out.
  3. Bind SamplingData to User.BakedSurface. Start with Seed = 0 and NormalOffset = 0.25.
  4. Remove later location modules that overwrite the position. Compile and save.
TUNS sets the spawn position from the saved static bank.
TUNS sets the spawn position from the saved static bank.
  1. Sampler placement

    After Initialize Particle in Particle Spawn.

  2. SamplingData

    Select User.BakedSurface in the binding menu.

  3. NormalOffset

    Lift the sample slightly off the surface.

3. Place the effect

Match the Niagara component’s position, rotation and scale to the baked mesh. No separate Static Mesh data interface is needed: the bank already stores its positions.

Skeletal-mesh emitter

1. Add the skeletal sampler

  1. Bake the exact skeletal mesh used by your actor. TUNS uses its LOD 0 geometry and the chosen UV channel.
  2. Prepare a GPU emitter with a spawn count, initialization, fixed bounds and a renderer, as shown in the emitter setup.
  3. Add TUNS_SampleSkeletalMesh after Initialize Particle in Particle Spawn.
  4. Bind SamplingData to a BakedSurface user parameter containing the skeletal bake.
The skeletal sampler needs both a bank and a matching animated mesh.
The skeletal sampler needs both a bank and a matching animated mesh.
  1. Particle Spawn

    Samples the current animated pose when each particle is born.

  2. SamplingData

    Select the skeletal bake input.

  3. Mesh

    Use TUNS Skeletal Mesh (GPU).

2. Set the mesh source

  1. Expand Mesh. Set Source Mode = Attach Parent.
  2. Set Preview Mesh to the matching skeletal mesh, and keep Whole Mesh LOD = 0.
  3. Start with Seed = 0 and a small NormalOffset, such as 0.25.
The preview mesh is for the Niagara editor; the attached component supplies the runtime pose.
The preview mesh is for the Niagara editor; the attached component supplies the runtime pose.
  1. Attach Parent

    Use the parent Skeletal Mesh Component.

  2. Preview Mesh

    Choose the same mesh used by the bake.

  3. Whole Mesh LOD

    Keep 0 to match the bank’s triangle indices.

3. Attach Niagara to the actor

  1. Open the actor Blueprint. Add or select its Skeletal Mesh Component and assign the matching mesh.
  2. Add a Niagara Component and drag it beneath the Skeletal Mesh Component in the Components tree. Assign your Niagara System.
  3. For a local-space effect, reset the Niagara component’s relative location and rotation to zero and scale to 1. Compile, save and test Play with an animation.
Example component names: AnimatedMesh is the parent; SurfaceParticles is its Niagara child.
Example component names: AnimatedMesh is the parent; SurfaceParticles is its Niagara child.
  1. AnimatedMesh

    The Skeletal Mesh Component playing the animation.

  2. SurfaceParticles

    Attach the Niagara component here.

For surface attachment, continue with Follow an animated mesh. A shared skeleton alone is not enough: the mesh geometry and triangle topology must match the bake.

Expose a user parameter

1. Create the input

  1. Open the Niagara System. In User Parameters, click + and search for TUNS Baked Surface (GPU).
  2. Name the parameter BakedSurface. Expand it and set Surface to your saved TUNS Surface Bake.
Add the user parameter on the left, then bind it in the sampler on the right.
Add the user parameter on the left, then bind it in the sampler on the right.
  1. Add a user parameter

    Click + and choose TUNS Baked Surface (GPU).

  2. Expand BakedSurface

    Open the parameter to assign its Surface field.

  3. SamplingData binding

    Choose User.BakedSurface.

The populated Surface field. DA_TUNS_Sphere is the example bake.
The populated Surface field. DA_TUNS_Sphere is the example bake.
  1. Surface

    Choose the baked Data Asset, not the source mesh or mask texture.

2. Bind and reuse it

  1. Select the TUNS sampling module. Open the binding menu beside SamplingData and select User.BakedSurface.
  2. Compile and save. For a different actor using the same system, select its Niagara component and assign a compatible bake in its user-parameter overrides.

BakedSurface is your chosen name. The SamplingData binding must match it. The supplied examples already define this parameter.

Use the sampled attributes

These are Niagara particle attributes. The sampler writes them before later modules run.

AttributeUse
Particles.PositionPosition already set by the sampler, including NormalOffset.
Particles.TUNS.PositionStored sampled position, including the offset. Useful as an effect origin.
Particles.TUNS.NormalSurface normal; use for outward motion or orientation.
Particles.TUNS.UVUV at the sample; use for color or reveal textures.
Particles.TUNS.MaskWeightBaked density weight; use for brightness or size.
Particles.TUNS.TriCoordTriangle and barycentric coordinate for this sample.
Particles.TUNS.TriangleTriangle index.
Particles.TUNS.VelocitySkeletal velocity; zero for the static module.
Particles.TUNS.ValidWhether the sample is usable. Invalid samples are also marked not alive.

Example: inherit the mesh’s motion

  1. Use the skeletal sampler in Particle Spawn. Add Set Variables immediately after it.
  2. Add Particles.Velocity to Set Variables. Open its value menu and bind Particles.TUNS.Velocity.
  3. Keep Solve Forces and Velocity in Particle Update. It integrates that velocity as the particle moves.
  4. Play the skeletal animation. Each new particle receives the surface velocity at its birth; it can then move independently.
A standard Set Variables module consumes the TUNS output directly.
A standard Set Variables module consumes the TUNS output directly.
  1. Set Variables

    Place after TUNS so the sampled attributes exist.

  2. TUNS.Velocity

    Bind this as the value of Particles.Velocity.

  3. Solve Forces and Velocity

    Integrates the particle’s movement in Update.

For outward motion, use Particles.TUNS.Normal × Speed instead. For texture color or reveal effects, use Particles.TUNS.UV as the texture coordinates.

Follow an animated mesh

Use the same TUNS_SampleSkeletalMesh module in Particle Spawn and Particle Update to keep particles on an animated mesh. No scratch module or additional bool is needed.

1. Finish the spawn setup

  1. Complete the skeletal-mesh setup and test the effect on the animated actor.
  2. Keep the sampler after Initialize Particle in Particle Spawn. This sets the position on the first frame.

2. Add the same sampler in Update

  1. Under Particle Update, click + and add TUNS_SampleSkeletalMesh.
  2. Use the same SamplingData, Mesh source, Seed and NormalOffset as the Spawn copy. Keep Whole Mesh LOD at 0 in both.
  3. Place it after any Update modules that move the particles. The last position write determines where they render.
  4. Compile and save. Play the character animation: existing particles should move with the sampled surface.
The same module initializes the sample in Spawn and refreshes its position in Update.
The same module initializes the sample in Spawn and refreshes its position in Update.
  1. Spawn copy

    Initial placement on the current pose.

  2. Update copy

    Refreshes the surface position each frame.

  3. Same inputs

    Match the bank, mesh, seed and offset used at spawn.

  4. Matching mesh source

    Attach Parent reads the actor’s animated Skeletal Mesh Component.

Choose the behavior you need

EffectSampler placement
Sparks or debris that leave the characterParticle Spawn only. Add velocity or forces for later motion.
Particles that remain on the animated surfaceParticle Spawn and Particle Update.
Ribbon points that remain attachedSpawn and Update for the points that must stay on the surface. Configure Ribbon ID and link order separately.
A trail that should remain behind a moving sourceDo not keep resampling all old trail points in Update.

Animation stretches the saved distribution; TUNS does not rebake or redistribute points each frame. Keep Seed stable so an existing particle keeps its sample location.

Spacing: Unreal vs TUNS

Unreal’s area-weighted sampler balances coverage by triangle area. TUNS also relaxes the spacing between points during the bake. In these captures, TUNS reduced nearest-neighbor spacing variation by 72.2% on the sphere and 64.7% on the skeletal mesh against the area-weighted reference.

Measured spacing consistency

ReferenceUnreal variationTUNS variationLess variation
Sphere — area-weighted0.5200.14572.2%
Skeletal mesh — area-weighted0.5250.18564.7%
Sphere — ordinary random0.5810.14575.1%
Skeletal mesh — ordinary random0.8520.18578.3%

Variation is the standard deviation of nearest-neighbor distances divided by their mean; lower means more consistent spacing. The percentage is 100 × (1 − TUNS variation / Unreal variation).

Against Unreal’s area-weighted sampler

Left: Unreal area-weighted sampling. Right: TUNS. Both TUNS banks were freshly GPU baked at 65,536 points, 64 Relaxation Iterations and 32 Integration Samples Per Point.

Sphere: Unreal area-weighted sampling on the left; TUNS on the right. 72.2% less measured spacing variation.
Sphere: Unreal area-weighted sampling on the left; TUNS on the right. 72.2% less measured spacing variation.
Skeletal mesh: Unreal area-weighted sampling on the left; TUNS on the right. 64.7% less measured spacing variation.
Skeletal mesh: Unreal area-weighted sampling on the left; TUNS on the right. 64.7% less measured spacing variation.

The sphere reference enables CPU and GPU uniform-distribution support. The skeletal reference enables uniform-distribution support on LOD 0, with all 92,178 triangle weights verified. Both use Niagara’s native RandomTriangle function.

Against ordinary random triangle sampling

Sphere: ordinary random sampling on the left; TUNS on the right. 75.1% less measured spacing variation.
Sphere: ordinary random sampling on the left; TUNS on the right. 75.1% less measured spacing variation.
Skeletal mesh: ordinary random sampling on the left; TUNS on the right. 78.3% less measured spacing variation.
Skeletal mesh: ordinary random sampling on the left; TUNS on the right. 78.3% less measured spacing variation.

Ordinary random triangle selection also shows density bias from unequal triangle sizes. Area weighting addresses that bias; spacing relaxation addresses the remaining clusters and gaps.

Camera distances match the supplied framing, so apparent dot size is not the numerical measurement. Percentages come from captured particle positions. For timing comparisons, see Memory and runtime cost.

Runtime cost and memory

This topic covers runtime cost only. Baking is an editor step and is not included here. During gameplay, TUNS reads the prepared sample bank on the GPU; it does not run spacing relaxation or rebuild the distribution.

What costs time at runtime?

WorkRuntime cost
Sampling in Particle SpawnEach new particle reads a bank entry. Skeletal sampling also resolves that point against the current animated pose.
Sampling in Particle UpdateAttached particles repeat the sample and skinning work each frame. Use this when they must follow the surface.
More live particlesMore Niagara simulation and rendering work, even when they share a sample bank.
Larger translucent spritesMore pixels to shade and potentially more overdraw.
Larger sample bankA larger GPU atlas to keep resident. Bank capacity does not set the live particle count.

Baked masks add no mask draw calls

The mask’s allowed regions and density are already stored in the baked distribution. TUNS does not render or sample the original mask texture for runtime particle placement, so the baked mask adds no runtime draw calls. The particles still have their usual renderer and material costs.

More particles than samples

Sample Bank Size is the number of reusable surface locations, not a particle limit. Sample indices wrap around the bank. For example, a burst of 4,096 particles can reuse a 1,024-point bank four times.

Those particles reuse the same surface locations; TUNS does not create another bank or generate extra unique points. They can overlap at spawn, then separate through their own motion. Particles kept attached can remain stacked at shared locations.

A smaller bank reduces atlas memory. Each particle still performs its own sampling, simulation and rendering work, so reusing locations does not make the extra particles free.

GPU memory

A 65,536-point bank uses approximately 2 MiB for skeletal samples or 4 MiB for static samples, plus a small header. Static banks also store positions and normals. GPUBytes reports the bank payload, not total VRAM used by meshes, materials, Niagara or the scene.

Compare runtime performance fairly

Match the mesh, mask coverage, live particle count, renderer, material, camera and resolution. Warm up shaders and loading, then run each method separately. Compare whole-frame, game-thread and GPU time; a side-by-side scene measures both effects together.

The comparison screenshots measure spacing quality, not runtime timing.

Rebaking and packaging

  1. After geometry, UV, mask or bake-setting changes, run TUNS Bake again.
  2. Recombine dependent destinations after their source banks are ready.
  3. Compile and save affected systems, then restart Niagara preview or components.
  4. Keep references to required bakes in system/component defaults or normal project assets so cooking includes them.
  5. Package a small test scene for your actual target. Check every static and skeletal path you use.

Use the engine-matched plugin. Author assets in the oldest engine version you need to support; saving in a newer engine is not a dependable way to deliver assets to an older one.

Rebaking requires the source mesh. Skeletal runtime sampling needs the matching mesh component. Static runtime sampling uses positions stored in the bake.

Fix common problems

SymptomCheck
Missing assets or modulesEnable TUNS and Niagara, show Plugin Content and check search filters and engine version.
No baked pointsCheck LOD 0 triangles and the UV channel. Temporarily remove the mask; black or rejected values provide no locations.
Tiny masked region failsCheck UVs and threshold. Broaden the allowed region or reduce bank size.
GPU bake failsRead Status and Output Log. Confirm rendering and a working RHI/shader target. There is no silent CPU fallback.
Niagara rejects the bakeRebake after changes; rebuild combined destinations; check Is Ready.
Invisible particlesCheck GPU Compute Sim, Surface, spawn count, lifetime, visible material/size and fixed bounds.
Dots are inside the static meshMatch Niagara position, rotation and scale. Attachment without inheriting scale can put every point inside the visible mesh.
Skeletal preview works but Play failsCheck Attach Parent, the actual Skeletal Mesh Component, matching topology and Whole Mesh LOD 0.
Particles stay behind during animationSpawn samples once. Add the same TUNS_SampleSkeletalMesh module in Particle Update to keep particles attached.
Offset only affects editor dotsPoint Surface Offset is preview-only; use Niagara NormalOffset.
Extra particles overlapCounts above bank capacity reuse positions. Increase the bank or reduce particles.
Gray mask does not reduce countGray affects density weight. Change Niagara’s spawn count.
Source missing in Combine pickerCheck mesh, UV channel, readiness, self references, duplicates and cycles.

For a useful bug report, include engine version, RHI/shader target, Status, mesh type, mask settings and relevant Output Log lines. Reproduce with one bake and one emitter first.

Return to the first-effect walkthrough for a known small setup.

Quick setup for Skeletal Meshes

Use TUNS_SampleSkeletalMesh in Particle Spawn to place new particles on the current animated pose. Add the same module in Particle Update when they should stay attached. No custom scratch module or extra bool is needed.

1. Bake the skeletal mesh

  1. In the Content Browser, right-click → Miscellaneous → Data Asset → TUNS Surface Bake. Name it DA_TUNS_Character.
  2. Open the asset. Set Mesh to the exact skeletal mesh used by your character. Leave Mask Texture empty for the whole surface; use UV Channel = 0.
  3. For this setup:
    Sample Bank Size = 1,024
    Relaxation Iterations = 64
    Integration Samples Per Point = 32.
    Click TUNS Bake, confirm Ready, and save.

2. Prepare a Niagara emitter

  1. Create a Niagara System with one standard emitter. In Emitter Properties, set Sim Target = GPUCompute Sim, enable Local Space, and use Fixed Bounds large enough to contain the animated character.
  2. Under Emitter Update, add Spawn Burst Instantaneous with Spawn Count = 1,024. Keep Initialize Particle in Particle Spawn, Particle State in Particle Update, and a Sprite Renderer. For testing, use a lifetime of 30 seconds and a small sprite size.
  3. In User Parameters, add a parameter of type TUNS Baked Surface (GPU) named BakedSurface. Expand it and set Surface to DA_TUNS_Character.

3. Particle Spawn – spawn from surface point

  1. Click + beside Particle Spawn and add TUNS_SampleSkeletalMesh. Place it after Initialize Particle. It appears in the stack as TUNS Sample Skeletal Mesh.
  2. Set SamplingData to User.BakedSurface. Start with Seed = 0 and NormalOffset = 0.25.
  3. Set Mesh to TUNS Skeletal Mesh (GPU). Expand its settings: Source Mode = Attach Parent, Preview Mesh = your baked skeletal mesh, and Whole Mesh LOD = 0.
Particle Spawn: the sampler runs after Initialize Particle and reads the current animated pose.
Particle Spawn: the sampler runs after Initialize Particle and reads the current animated pose.
  1. Spawn sampler

    Place this below Initialize Particle. It writes the particle’s initial position.

  2. SamplingData

    Bind User.BakedSurface, with Surface set to your skeletal bake.

  3. Mesh input

    Use TUNS Skeletal Mesh (GPU), then expand its source settings.

Mesh settings for both sampler copies. The preview mesh must match the baked mesh.
Mesh settings for both sampler copies. The preview mesh must match the baked mesh.
  1. Attach Parent

    Read the animated Skeletal Mesh Component that owns the Niagara component.

  2. Preview Mesh

    Choose the exact skeletal mesh baked in step 1.

  3. Whole Mesh LOD

    Keep 0 so the runtime triangle indices match the bake.

4. Particle Update: Follow the surface after spawning

  1. For an attached effect, keep the Spawn copy. Click + beside Particle Update and add TUNS_SampleSkeletalMesh again.
  2. Match the Spawn copy’s SamplingData, Mesh source, Preview Mesh, Whole Mesh LOD, Seed and NormalOffset. Use User.BakedSurface in both copies and keep Seed constant.
  3. Place the Update copy after Particle State and after any modules that change position. For this simple attached effect, no forces or velocity solver are needed. Compile and save.
Spawn initializes the position; Update refreshes it each frame. The “001” suffix is Niagara’s name for the second copy.
Spawn initializes the position; Update refreshes it each frame. The “001” suffix is Niagara’s name for the second copy.
  1. Keep the Spawn copy

    Gives the particle a valid surface position on its first frame.

  2. Add the Update copy

    Re-evaluates the same sample on the animated surface each frame.

  3. Share the same bake

    Both SamplingData inputs use User.BakedSurface.

  4. Match the source

    Use the same Attach Parent source, matching mesh and LOD 0 in both copies.

5. Attach it to the animated character

  1. Open the character or actor Blueprint. Add a Niagara Component, assign your Niagara System, and drag the component beneath the matching Skeletal Mesh Component in the Components tree.
  2. Reset the Niagara component’s relative location and rotation to 0, and scale to 1. Play an animation on the Skeletal Mesh Component, then compile, save and test Play.
  3. With Spawn + Update, the same particles should stay on the animated surface. Disable the Update copy to compare: particles keep their last sampled positions and are no longer refreshed with the changing pose. Restart the effect to test its spawn behavior again.
Example component names: AnimatedMesh is the skeletal parent; SurfaceParticles is its Niagara child.
Example component names: AnimatedMesh is the skeletal parent; SurfaceParticles is its Niagara child.
  1. Skeletal Mesh Component

    Assign the mesh that matches the bake and play its animation.

  2. Niagara child

    Attach the effect here so Attach Parent finds the animated mesh.

Search TUNS

Type at least two characters to search.