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