Tiled Runtime Nav-mesh generation for 3D worlds in Bevy. Based on Recast's Nav-mesh generation but in Rust.
Takes in Bevy Rapier3D colliders from entities with the NavMeshAffector
component and asynchronously generates tiles of navigation meshes based on NavMeshSettings
.
Nav-mesh generation:
1. Insert an instance of the NavMeshSettings
resource into your Bevy app.
2. Add OxidizedNavigationPlugin
as a plugin.
3. Attach a NavMeshAffector
component and a rapier collider to any entity you want to affect the nav-mesh.
At this point nav-meshes will be automatically generated whenever the collider or GlobalTransform
of any entity with a NavMeshAffector
is changed.
Querying the nav-mesh / Pathfinding: 1. Your system needs to take in the [NavMesh] resource. 2. Get the underlying data from the nav-mesh using [NavMesh::get]. This data is wrapped in an [RwLock]. 3. To access the data call [RwLock::read]. This will block until you get read acces on the lock. If a task is already writing to the lock it may take time. 4. Call [query::find_path] with the [NavMeshTiles] returned from the [RwLock].
Also see the [examples] for how to run pathfinding in an async task which may be preferable.
| Crate Version | Bevy Version | Bevy Rapier 3D Version | | ------------- | ------------ | ---------------------- | | 0.1.0 | 0.9.1 | 0.19 |
Note: These are the versions the crate is built against. It may work with newer versions.
[X] Quick "How to use" guide.
[ ] Built-in nav-mesh debug draw.
NavMeshAffector
).[ ] Switch to the Bevy 0.9 plugin settings system.
[ ] Code Tests.
Whilst not included in the plugin currently, you can use Bevy Prototype Debug Lines and the following snippet in a system to draw up the nav-mesh:
```rust
fn drawnavmesh(
navmeshsettings: Res
if let Ok(nav_mesh) = nav_mesh.get().read() {
for (_, tile) in nav_mesh.get_tiles().iter() {
// Draw polygons.
for poly in tile.polygons.iter() {
let indices = &poly.indices;
for i in 0..indices.len() {
let a = tile.vertices[indices[i] as usize];
let b = tile.vertices[indices[(i + 1) % indices.len()] as usize];
lines.line(a, b, 15.0);
}
}
// Draw vertex points.
for vertex in tile.vertices.iter() {
lines.line(*vertex, *vertex + Vec3::Y, 15.0);
}
}
}
} ```