1个不稳定版本
0.1.0 | 2022年12月31日 |
---|
1722 in 游戏开发
5MB
20K 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