Baker Events
The BakerEvents class is a global event hub for runtime baking.
Note: This is not a separate component you need to add — it is built into the system.
It broadcasts when per-surface, combined-window, or one-shot bakes start, complete, or fail. Use these events to trigger gameplay logic after navmesh updates — for example, spawning AI only once a valid navmesh exists.
Available Events
// Per-surface events
event Action<DynamicNavMeshSurface, Bounds> OnBakeStarted;
event Action<DynamicNavMeshSurface, Bounds, float> OnBakeCompleted;
event Action<DynamicNavMeshSurface, Bounds, string> OnBakeFailed;
// Combined-window events
event Action<int, Bounds> OnCombinedBakeStarted;
event Action<int, Bounds, float> OnCombinedBakeCompleted;
// One Shot events (new in 1.4.0)
event Action<int, Bounds> OnOneShotBakeStarted;
event Action<int, Bounds, float> OnOneShotBakeCompleted;
OnBakeStarted(DynamicNavMeshSurface surface, Bounds bounds) Raised when a per-surface bake begins.
surface
may benull
in combined or one-shot mode.OnBakeCompleted(DynamicNavMeshSurface surface, Bounds bounds, float seconds) Raised when a per-surface bake finishes successfully. Includes duration in seconds.
OnBakeFailed(DynamicNavMeshSurface surface, Bounds bounds, string reason) Raised when a bake is skipped or fails.
reason
provides a textual cause (e.g."no sources"
).OnCombinedBakeStarted(int agentTypeId, Bounds bounds) Raised when a combined-window bake begins for a specific agent type.
OnCombinedBakeCompleted(int agentTypeId, Bounds bounds, float seconds) Raised when a combined-window bake completes successfully.
OnOneShotBakeStarted(int agentTypeId, Bounds bounds) (new in 1.4.0) Raised when a one-shot bake begins for a given agent type.
OnOneShotBakeCompleted(int agentTypeId, Bounds bounds, float seconds) (new in 1.4.0) Raised when a one-shot bake finishes successfully.
Example: Spawn After Bake
using MegaCrush.RuntimeNavmeshBaker;
using UnityEngine;
public sealed class SpawnAfterBake : MonoBehaviour
{
[SerializeField] private GameObject prefab;
private void OnEnable()
{
BakerEvents.OnOneShotBakeCompleted += HandleBakeCompleted; // new in 1.4.0
BakerEvents.OnBakeCompleted += HandleBakeCompleted; // fallback for per-surface mode
}
private void OnDisable()
{
BakerEvents.OnOneShotBakeCompleted -= HandleBakeCompleted;
BakerEvents.OnBakeCompleted -= HandleBakeCompleted;
}
private void HandleBakeCompleted(DynamicNavMeshSurface s, Bounds b, float dur)
{
if (!prefab) return;
if (UnityEngine.AI.NavMesh.SamplePosition(transform.position, out var hit, 5f, UnityEngine.AI.NavMesh.AllAreas))
{
Instantiate(prefab, hit.position, Quaternion.identity);
Debug.Log($"Spawned {prefab.name} after bake at {hit.position}");
}
}
}
Best Practices
Subscribe/Unsubscribe in
OnEnable
/OnDisable
to avoid leaks.Use OnBakeCompleted or OnOneShotBakeCompleted to safely trigger AI spawning.
Use OnBakeFailed for debug logs or fallback behavior.
Use Combined events only if relying on global combined-window mode (Grid Cells + Combine Tiles).
Runtime Spawner integration:
Pair with placement policies (Require, Prefer, Ignore).
For “Require”, defer spawning until
OnBakeCompleted
orOnOneShotBakeCompleted
fires.
Last updated