Quick answer: Unreal Niagara CPU system reading stale values from a Data Interface set via Blueprint? CPU sims tick on the game thread but DI writes are batched - call MarkRenderDirty after Set.
Health bar VFX should reflect current HP. After SetFloat on the DI, the emitter still shows last frame's value.
Mark the system dirty
NiagaraComponent->MarkRenderStateDirty();After setting Data Interface values, force a state refresh. Otherwise the next tick reads from the cached buffer.
Use User Parameters when possible
For simple scalar/vector values, user parameters propagate same-frame. Data Interfaces are the heavyweight path; use them only when you need their features.
Avoid late-tick writes
Set DI values in Tick(), not in pre-physics callbacks. Render thread snapshots happen between - writes after that get queued for next frame.
“Niagara has multiple tick groups. Data flows on a schedule.”
For UI-driven VFX (health bars, ammo glow), prefer user parameters. Data Interfaces are for query-heavy patterns like raycast results.