BabylonJS/Babylon.js · error
No particle systems were produced by the node particle syste
Error message
No particle systems were produced by the node particle system.
What it means
NodeParticleSystemSet.buildAsync(scene) compiles the node particle set into concrete particle systems. The library expects a successfully built set to yield at least one system; if the produced array is empty the build effectively yielded nothing usable, so the extension throws instead of returning an invalid/empty result. This guards downstream code that assumes systems[0] exists.
Source
Thrown at packages/dev/inspector-v2/src/extensions/quickCreate/particles.tsx:76
system.start();
resolve(system);
}, 0);
});
};
const handleCreateNodeAsync = async () => {
let nodeParticleSet;
const snippetId = nodeParticleSystemSnippetId.trim();
if (snippetId) {
nodeParticleSet = await NodeParticleSystemSet.ParseFromSnippetAsync(snippetId);
nodeParticleSet.name = nodeParticleSystemName;
} else {
nodeParticleSet = NodeParticleSystemSet.CreateDefault(nodeParticleSystemName);
}
const particleSystemSet = await nodeParticleSet.buildAsync(scene);
const systems = particleSystemSet.systems;
if (systems.length === 0) {
throw new Error("No particle systems were produced by the node particle system.");
}
for (const system of systems) {
system.name = nodeParticleSystemName;
}
particleSystemSet.start();
return systems[0];
};
return (
<QuickCreateSection>
{/* CPU Particle System */}
<QuickCreateItem selectionService={selectionService} label="CPU Particle System" onCreate={handleCreateCPUAsync}>
<TextInputPropertyLine label="Name" value={cpuParticleSystemName} onChange={(value) => setCpuParticleSystemName(value)} />
<SpinButtonPropertyLine
label="Capacity"
value={cpuParticleSystemCapacity}
onChange={(value) => setCpuParticleSystemCapacity(value)}
min={1}View on GitHub (pinned to 0592b347b8)
Solutions
- Verify the node particle set graph has a complete, connected emitter/output chain before calling buildAsync.
- Wait for scene.whenReadyAsync() and ensure the engine is initialized before building the set.
- Re-export the node particle set with a matching Babylon.js version (node particle system API changed across versions).
- Log particleSystemSet.systems length and the set's block graph to find why compilation produced no systems; fall back to NodeParticleSystemSet.CreateDefault to confirm the runtime itself works.
Example fix
// before
const set = NodeParticleSystemSet.Parse(serializedJson, scene);
const particleSystemSet = await set.buildAsync(scene); // throws if 0 systems
// after
await scene.whenReadyAsync();
const particleSystemSet = await set.buildAsync(scene);
if (particleSystemSet.systems.length === 0) {
console.warn("Node particle set produced no systems; using default");
const fallback = await NodeParticleSystemSet.CreateDefault("default").buildAsync(scene);
fallback.start();
}
else {
particleSystemSet.start();
} Defensive patterns
Strategy: validation
Validate before calling
const particleSystemSet = await nodeParticleSet.buildAsync(scene);
if (!particleSystemSet || particleSystemSet.systems.length === 0) {
throw new Error("Node particle set built zero systems");
} Type guard
function hasSystems(set: { systems: unknown[] }): set is { systems: [unknown, ...unknown[]] } {
return Array.isArray(set?.systems) && set.systems.length > 0;
} Try / catch
try {
const systems = await buildNodeParticles(scene);
systems[0].name = name;
} catch (e) {
if (e instanceof Error && e.message.includes("No particle systems")) {
rebuildWithDefaultSet(scene);
} else {
throw e;
}
} Prevention
- Validate the node graph has emitter/output blocks before buildAsync.
- Call buildAsync after scene.whenReadyAsync().
- Pin Babylon.js versions consistent with the node particle set exporter.
- Assert systems.length > 0 in automated tests for particle assets.
When it happens
Trigger: Calling buildAsync on a NodeParticleSystemSet (including CreateDefault) that compiles to zero systems — e.g. a custom/loaded node graph with no emitter blocks wired to output, or a default set failing to expand on the current engine.
Common situations: Loading a serialized node particle set JSON that was hand-edited or exported from an incompatible Babylon version; building a programmatically constructed set before all required blocks were added; engine/scene not fully ready when buildAsync resolves; version mismatch between the node particle editor export and runtime library.
Related errors
- WebGPU shader language is only supported with WebGPU engine
- This node is not meant to be an output node. You may want to
- Unable to find a compatible match
- Cannot connect these two connectors. source: "${this.ownerBl
- At least one mesh is needed to create the nav mesh.
AI-assisted analysis of BabylonJS/Babylon.js@0592b347b8 (2026-08-30).
Data as JSON: /api/errors/2ab0a08098148c0d.
Report an issue: GitHub.