BabylonJS/Babylon.js · error · Error

There is no NavMesh generated.

Error message

There is no NavMesh generated.

What it means

RecastNavigationJSPlugin.getNavmeshData() exports the built navmesh as a Uint8Array for persistence, but requires that a navmesh has actually been built first (this.navMesh set by createNavMesh). If this.navMesh is null/undefined, the plugin throws this error instead of returning garbage.

Source

Thrown at packages/dev/addons/src/navigation/plugin/RecastNavigationJSPlugin.ts:501

    }

    /**
     * build the navmesh from a previously saved state using getNavmeshData
     * @param data the Uint8Array returned by getNavmeshData
     */
    public buildFromNavmeshData(data: Uint8Array): void {
        const result = this.bjsRECAST.importNavMesh(data);
        this.navMesh = result.navMesh;
        this._navMeshQuery = new this.bjsRECAST.NavMeshQuery(this.navMesh);
    }

    /**
     * returns the navmesh data that can be used later. The navmesh must be built before retrieving the data
     * @returns data the Uint8Array that can be saved and reused
     */
    public getNavmeshData(): Uint8Array {
        if (!this.navMesh) {
            throw new Error("There is no NavMesh generated.");
        }
        return this.bjsRECAST.exportNavMesh(this.navMesh);
    }

    /**
     * build the tile cache from a previously saved state using getTileCacheData
     * @param tileCacheData the data returned by getTileCacheData
     * @param tileCacheMeshProcess optional process to apply to each tile created
     */
    public buildFromTileCacheData(tileCacheData: Uint8Array, tileCacheMeshProcess?: TileCacheMeshProcess): void {
        const result = this.bjsRECAST.importTileCache(tileCacheData, tileCacheMeshProcess ?? CreateDefaultTileCacheMeshProcess([]));
        this.navMesh = result.navMesh;
        this._tileCache = result.tileCache;
        this._navMeshQuery = new this.bjsRECAST.NavMeshQuery(this.navMesh);
    }

    /**
     * returns the tile cache data that can be used later. The tile cache must be built before retrieving the data

View on GitHub (pinned to 0592b347b8)

Solutions

  1. Call createNavMesh (or createNavMeshAsync) successfully before calling getNavmeshData
  2. Check this.navMesh / plugin.isSupported state before exporting
  3. If building asynchronously, await the creation promise before exporting
  4. If the plugin was disposed, recreate the plugin and rebuild the navmesh

Example fix

// before
const data = plugin.getNavmeshData();
// after
if (!plugin.navMesh) {
    await plugin.createNavMeshAsync(meshes, parameters);
}
const data = plugin.getNavmeshData();
Defensive patterns

Strategy: validation

Validate before calling

if (!plugin.navMesh) {
    throw new Error("Build the navmesh before exporting");
}
const data = plugin.getNavmeshData();

Type guard

const hasNavmesh = (p: { navMesh?: unknown }): p is { navMesh: object } => p.navMesh != null;

Try / catch

try {
    const data = plugin.getNavmeshData();
} catch (e) {
    if (e.message.includes("no NavMesh generated")) {
        await plugin.createNavMeshAsync(meshes, params);
    }
}

Prevention

When it happens

Trigger: Calling getNavmeshData() before ever calling createNavMesh/createNavMeshAsync, or after createNavMesh threw 'Unable to create navmesh', or after dispose() cleared the plugin state.

Common situations: Trying to save a navmesh at app startup before the build step runs; saving after a failed creation due to bad parameters or geometry; ordering bugs in async code where the save runs before the awaited build finishes.

Related errors


AI-assisted analysis of BabylonJS/Babylon.js@0592b347b8 (2026-08-30). Data as JSON: /api/errors/51402890c0939fbc. Report an issue: GitHub.