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 在 游戏开发
每月670次下载
在 2 个Crate 中使用
195KB
4K SLoC
氧化导航
Bevy中3D世界的Tiled 运行时 导航网格生成。基于Recast的导航网格生成,但使用Rust。
接收Parry3d碰撞器,这些碰撞器实现了从具有NavMeshAffector组件的实体中的OxidizedCollider特质,并基于NavMeshSettings异步生成导航网格的瓦片。OxidizedCollider的实现包括Bevy Rapier3D和Bevy Xpbd_3D,位于rapier和xpbd功能之下。
快速入门
导航网格生成
- 选择你将要使用的后端(bevy_rapier3d、bevy_xpbd_3d或自定义parry3d基于碰撞器)并启用相关的crate功能("rapier"、"xpbd"或"parry_016"功能)。
- 如果你选择了自定义parry3d碰撞器,为你的碰撞器组件实现
OxidizedCollider特质,该组件封装了一个parry3d::shape::SharedShape。这已经在bevy_rapier3d和bevy_xpbd_3d中完成了。 - 将
OxidizedNavigationPlugin作为插件添加。(例如,对于xpbdOxidizedNavigationPlugin::<Collider>::new(NavMeshSettings {...}) - 将一个
NavMeshAffector组件和一个实现了OxidizedCollider特质的碰撞器(已为bevy_rapier3d和bevy_xpbd_3D实现)附加到任何你想要影响导航网格的实体上。
在此阶段,只要具有 NavMeshAffector 的任何实体的碰撞体或 GlobalTransform 发生变化,就会自动生成导航网格。
查询导航网格/路径查找
- 您的系统需要接收
NavMesh资源。 - 使用
NavMesh::get从导航网格获取底层数据。这些数据被包裹在一个RwLock中。 - 要访问数据,请调用
RwLock::read。 这将阻塞,直到您获得锁的读访问权限。如果任务已经在写入锁,它可能需要时间。 - 使用从
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