## 概述 为了确保机器人能够绕过建筑物和树木等障碍物,我们使用了 *导航网格* 系统。此系统根据高度贴图、陆地网格或水(取决于设置)生成一个单独的网格,用于定义机器人可以遍历的区域。网格在 [daEditor](../daeditor/daeditor.md) 的 **locationed/properties** 选项卡下生成。 导航网格在每次导出时都会生成一个二进制文件。 导航网格是自上而下生成的,这意味着桥梁或其他高架资产下不会有导航网格。要避免这种情况,可以在 `develop/gameBase/config/navmesh_layers.blk` 中的 `filter{}` 块下指定要排除的 rendinst。语法如下 ```text "^.*af_conveyor.*$" {} ``` 这是一个正则表达式,允许您按名称排除所有资产或特定资产。请注意,结尾 `*$" {}` 是必需的。 ```{important} 要成功生成地面导航网格,关卡中必须至少存在一条样条(水上导航网格仅基于水面计算)。 ``` ## Navigation Mesh 接口 Navigation mesh interface Navigation mesh interface 这些设置通常很简单,但以下是关键选项: - **Full main HMAP/Detailed HMAP/Explicit area**: 此选项选择要为其生成导航网格的位置部分。建议仅绘制详细区域,如果未使用整个位置,则甚至更少。映射整个细节区域可以: - 将二进制文件大小增加到超出合理限制。 - 降低服务器性能。 - **Navmesh type**: 定义导航网格的生成方式。 - **Water navigation**: 在水上生成导航网格。 - **Splines navigation**: 在 Splines 周围生成 Navmesh 。如果在启用了 **Use for navmesh** 复选框的情况下没有样条,则不会生成导航网格。 - **Height from above**: 根据自上而下视图中的几何体生成网格。 - **Detailed geometry**: 将高细节 Rendinst 用于 Navigation Mesh。 - **Water and geometry**: 根据水和几何体生成导航网格,同时考虑在表面上遇到的任何 rendinst。 - **Use water surface**: 不包括高度贴图的水下部分,使其无法被坦克接近。水高在 **Crossing water** 块中定义,确保机器人可以穿过小水体。 - **Water navigation**: 生成船舶的导航网格。目前,不能在同一位置同时拥有坦克和飞船导航网格。 默认情况下,导航网格会生成一个相当密集的网格。但是,对于狭窄的街道或其他狭小空间,可能需要调整像元大小或与障碍物的距离。 - **Use detailed geometry** 和 **Tiled navmesh**可用于基于 daNetGame 的项目。
基于 daNetGame 的项目还允许机器人使用导航网格跳过障碍物(例如栅栏)并躲在物体后面。 ## 导航网格跳转、链接和掩体接口 Navmesh jumps, links, and cover interface - **Export jump links mesh**: 生成跳转链接,这对于大多数地图来说都是必不可少的。 没有这个,机器人将无法跳过栅栏。 - **jump over height**: 机器人可以跳过的障碍物的最大高度。 - **jump length**: 障碍物的深度和两个跳跃点之间的最大距离。 - **delta height**: 定义将单个 jump link 拆分为较小跳跃的高度差(防止 Bot 跳过过高的物体,如杆子)。 - **merge delta angle**: 合并不同跳转链接的角度。 - **max angle between edge**: 另一个与 Jump Link 合并相关的设置。 - **Export covers**: 为 Bot 生成 Cover Points。 对于前四个设置,这些只是封面的大小限制: - **min window for shoot**: 定义一个窗口(例如,一个小开口),机器人可以通过该窗口进行射击。一旦找到,它就标志着一个掩护点的结束。 - **collision transparent**: 确定碰撞的透明度。此功能的精度有限,因为体素化碰撞不精确。由于简化的碰撞数据用于地图生成,因此可能无法识别小间隙(例如,对于具有大开口的手推车或栅栏)。 - **delta height**: 与跳转链接类似,此设置根据高度差异划分掩体点(例如,中间有窗户的墙壁可能会导致三个单独的掩体点:完全覆盖、半覆盖和完全覆盖)。 - **shoot depth**: 检查从掩体射击的可能性。生成机器人可以射击的特殊点,这些点是从掩体的边缘追踪的。
## 坦克导航网格 坦克导航网格受样条线约束。您可以使用现有样条曲线,也可以专门为导航网格创建新样条曲线。 Tank navigation mesh 如果样条在属性面板中启用了 **Use for navmesh** 复选框,则网格将包含样条周围指定半径内的区域。
创建导航网格后,水平仪目录中会出现其他文件,如 `navMesh.PC.bin` 和/或 `navMesh2.PC.bin`。 要在 [daEditor](../daeditor/daeditor.md) 中查看导航网格,请在面板中启用 **show exported navmesh** 选项。 要在游戏中查看导航网格,请使用控制台命令`ai.debug_nav`。 **常见错误** 以下错误指示关卡中缺少 tank/ship navigation mesh: ```text 18.43 [F] $03 FATAL ERROR: skyquake\prog\main\app.cpp,5191: assert failed in ..\..\skyquake\prog\main\app.cpp:5191,AcesApp::doJob() : "pathfinder::isLoaded() || (strstr(levelFileName, "avg_") != levelFileName && strstr(levelFileName, "avn_") != levelFileName)" Call stack (5 frames): ... ``` ## 在 daEditor 中显示导航 可以从以下菜单中切换导航和其他对象显示模式: Displaying navigation in daEditor - **Show exported nav mesh**: 显示具有红黄叠加层的导航区域。 Show exported nav mesh - **Show exported covers**: 绿色显示人工智能的覆盖点。 Show exported covers - **Show exported nav mesh obstacles**: 用紫色方框显示导航障碍。 Show exported nav mesh obstacles