#bevy #mesh-generation #nav-mesh #gamedev #navmesh-generation

oxidized_navigation

Bevy引擎的导航网格生成插件

15个版本 (破坏性)

0.11.0 2024年7月15日
0.10.0 2024年2月23日
0.9.0 2024年2月17日
0.8.0 2023年11月9日
0.3.0 2023年3月7日

#80游戏开发

Download history 119/week @ 2024-04-27 98/week @ 2024-05-04 109/week @ 2024-05-11 157/week @ 2024-05-18 119/week @ 2024-05-25 136/week @ 2024-06-01 100/week @ 2024-06-08 171/week @ 2024-06-15 174/week @ 2024-06-22 91/week @ 2024-06-29 76/week @ 2024-07-06 235/week @ 2024-07-13 188/week @ 2024-07-20 241/week @ 2024-07-27 113/week @ 2024-08-03 111/week @ 2024-08-10

每月670次下载
2 个Crate 中使用

MIT/Apache

195KB
4K SLoC

氧化导航

Crates.io Crates.io

Bevy中3D世界的Tiled 运行时 导航网格生成。基于Recast的导航网格生成,但使用Rust。

接收Parry3d碰撞器,这些碰撞器实现了从具有NavMeshAffector组件的实体中的OxidizedCollider特质,并基于NavMeshSettings异步生成导航网格的瓦片。OxidizedCollider的实现包括Bevy Rapier3DBevy Xpbd_3D,位于rapierxpbd功能之下。

快速入门

导航网格生成

  1. 选择你将要使用的后端(bevy_rapier3d、bevy_xpbd_3d或自定义parry3d基于碰撞器)并启用相关的crate功能("rapier"、"xpbd"或"parry_016"功能)。
  2. 如果你选择了自定义parry3d碰撞器,为你的碰撞器组件实现OxidizedCollider特质,该组件封装了一个parry3d::shape::SharedShape。这已经在bevy_rapier3dbevy_xpbd_3d中完成了。
  3. OxidizedNavigationPlugin作为插件添加。(例如,对于xpbd OxidizedNavigationPlugin::<Collider>::new(NavMeshSettings {...})
  4. 将一个NavMeshAffector组件和一个实现了OxidizedCollider特质的碰撞器(已为bevy_rapier3dbevy_xpbd_3D实现)附加到任何你想要影响导航网格的实体上。

在此阶段,只要具有 NavMeshAffector 的任何实体的碰撞体或 GlobalTransform 发生变化,就会自动生成导航网格。

查询导航网格/路径查找

  1. 您的系统需要接收 NavMesh 资源。
  2. 使用 NavMesh::get 从导航网格获取底层数据。这些数据被包裹在一个 RwLock 中。
  3. 要访问数据,请调用 RwLock::read这将阻塞,直到您获得锁的读访问权限。如果任务已经在写入锁,它可能需要时间。
  4. 使用从 RwLock 返回的 NavMeshTiles 调用 query::find_path

有关如何在异步任务中运行路径查找的示例,请参阅 示例,这可能是更可取的方法。

常见问题解答(FAQ)

我将 OxidizedNavigationPlugin 添加到我的应用程序中,但现在它无法编译。

您需要使用 OxidizedNavigationPlugin::new(NavMeshSettings {...},其中 Collider 是 rapier 或 xpbd Collider,或者您自己的自定义碰撞体,该碰撞体实现了 OxidizedCollider 特性。这是必要的,以便我们可以对不同 Collider 组件进行泛型处理。

当启用 XPBD 时,我得到错误消息 "您必须选择单个 parry3d 功能"。

您需要禁用默认的 parry_016 功能,因为 XPBD 使用 Parry3d 的不同版本。

需要默认启用 Parry3d 的某个版本,以便包可以编译和发布。

我不想使用 Rapier3d 或 XPBD3d 物理引擎来生成导航网格。我如何创建自己的 parry3d 包装组件?

您需要创建一个包含 parry3d SharedShape 的组件,然后实现 OxidizedCollider 特性。请参阅 parry3d 示例 以获取基本示例。

我可以使用内置的 bevy 形状或我的自定义形状吗?

目前仅支持 parry3d 碰撞体,或使用 parry3d 碰撞体的包。您需要编写一个函数将您的形状/bevy 形状转换为 parry3d 碰撞体。

为什么我的 Xpbd/Parry3d 碰撞体没有正确缩放?

您需要手动将变换的缩放应用到 Xpbd/Parry3d 碰撞体的形状上。

我的物理包更新后,我的导航网格无法生成。

这是由于依赖项的处理方式,Oxidized Navigation 将仅与 支持版本 中指定的版本交互。如果您想使用其他版本,您可以 让 cargo 使用不同的版本

我如何绘制导航网格进行调试?

调试绘制可以通过 debug_draw 功能和 OxidizedNavigationDebugDrawPlugin 来访问,请参阅示例中的用法。

支持版本

包版本 Bevy 版本 Bevy Rapier 3D 版本 Bevy Xpbd 3D 版本 Parry3d 版本
0.11.0 0.14 0.27 0.5 0.15/0.16
0.10.0 0.13 0.25 0.4 0.13
0.9.0 0.12 0.24 0.3 0.13
0.8.0 0.12 0.23 0.3 0.13
0.7.0 0.11 0.22 0.2 0.13
0.6.0 0.11 0.22 不受支持 不受支持
0.5.X 0.10.X 0.21 不受支持 不受支持
0.4.0 0.10.X 0.21 不受支持 不受支持
0.3.0 0.10.0 0.21 不受支持 不受支持
0.2.0 0.9.X 0.20 不受支持 不受支持
0.1.X 0.9.X 0.19 不受支持 不受支持

使用不受支持的Rapier、Xpbd或parry3d版本会导致Oxidized Navigation失败,因为它试图获取错误的组件版本。在这种情况下,您可能能够覆盖Oxidized Navigation所依赖的版本

非详尽待办事项列表

  • 允许从网格创建nav-mesh(可能在NavMeshAffector中添加一个选项)。

  • 当更改NavMeshSettings时,重新构建所有瓦片。

  • 使用不同的NavMeshSettings的nav-mesh "层"。

  • 路径查找票证系统(调用路径查找返回一个可以在以后检查的票证,以这种方式控制异步路径查找,可以让我们限制并行任务的数量并优先处理它们)

  • 为了从一开始就创建正确格式的数据,移除create_nav_mesh_tile_from_poly_mesh

  • 添加局部nav-mesh子网格,可以用于移动对象(平台、船只等),无需在每次更新时重新生成其内部。

依赖项

~37–74MB
~1.5M SLoC