1个不稳定版本

0.1.0 2022年12月31日

1722 in 游戏开发

MIT 许可证

5MB
20K SLoC

C++ 18K SLoC // 0.1% comments Rust 1.5K SLoC // 0.0% comments ReScript 10 SLoC C 4 SLoC

包含(Windows DLL,620KB)recast_src/x64/Debug/AiNav.dll,(ELF库,365KB)lib/libAiNav.so,(Windows DLL,205KB)lib/AiNav.dll,(Windows DLL,205KB)recast_src/x64/Release/AiNav.dll,(DOS可执行文件,110KB)CMakeCXXCompilerId.exe,(DOS可执行文件,110KB)CMakeCXXCompilerId.exe 等5个更多

recast_navigation

Rust封装的recast导航库

这是一个对recast导航库的更高层次的C++封装的封装。因此,Rust端相对较高层次。支持recast、detour和detour crowd,程度不同。一些功能如offmesh links不支持。

从源代码构建

C++源代码使用cmake构建,并具有VS cmake项目配置。在lib中提供了Windows和Linux的预编译库。build.rs会将它们复制到构建输出中。

如果您从源代码构建,则需要手动将cmake创建的共享库复制到lib中。

Navmesh构建流程

  • 创建一个NavmeshBuilder。
  • 创建一个Navmesh。
  • NavmeshBuildUtils::get_overlapping_tiles_from_settings将给出一个包含所有在边界内的tile坐标的列表。
  • 获取这些tile,并对每个tile调用NavmeshBuildUtils::calculate_tile_bounding_box以获取tile边界。
  • 为每个tile创建一个TileInputBuilder。
  • 收集tile边界的几何形状,并将其提供给TileInputBuilder。
  • NavmeshBuilder有一个built_tile函数,它接受一个TileInputBuilder。单个构建器可以构建多个tile。
  • 将tile添加到navmesh

Tile构建与navmesh完全分离。因此,您可以在运行时在后台构建tile,然后将其添加/替换到navmesh中,这相对较快/便宜。

Navmesh查询

查询通过NavQuery实例进行。查询包含对navmesh的指针,因此不能在向navmesh添加/删除tile时使用。

我们通过查询是从属于navmesh的查询池中获得的,以及一些简单的引用计数来确保这一点。如果您有租用的查询,则不允许您修改navmesh。

在navmesh上移动代理

这里的流程很简单,但重要的是要理解存在一个导航网格和一个单独的细节网格。

您在导航网格上寻路,但它不会返回正确的表面高度。您调用NavQuery.get_location,传入一个在路径上的位置,它返回表面高度。

人群

绕行人群表现尚可,但这是人们通常定制或自行创建的重塑区域。不要期望它的行为与像UE或Unity这样的引擎提供的行为相匹配,因为它们随着时间的推移对绕行人群进行了大量定制。

依赖项

~10MB
~204K SLoC