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.