导航网格表面(NavMeshSurface)
Version >= LayaAir 3.2
一、概述
NavMeshSurface(静态导航表面)是LayaAir 3D导航系统中用于生成导航网格的核心组件。它将环境中角色可以行走的表面(地面、平台、斜坡等)转换为多边形网格,为寻路算法提供基础数据。
该组件继承自BaseNavMeshSurface,是3D导航系统实现寻路的主体。导航网格中的数据都是全局静态的,不会随着场景节点的动态变化而更新,如需动态导航网格请使用NavMeshModifileSurface(动态导航表面)组件。
在LayaAir-IDE的属性面板中,该组件显示为静态导航表面。
关于3D寻路的整体介绍,请参考3D寻路。
二、属性说明
2.1 代理类型 agentType
用于指定在该导航表面上寻路的代理类型。不同类型的代理在寻路时会有不同的特性和限制,如体积大小、移动方式、可通过的区域类型等。
默认值为Humanoid(人形角色)。开发者可以通过选择open Agent Settings打开配置界面,新增自定义的代理类型。
Agent配置页面中的参数用于调节适用该类型Agent的地形,而不是Agent本身:
agentName:Agent类型的名称,此处填写的名称将与代理类型处的选项名称一致。agentRadius:Agent在导航过程中与障碍物之间的最小距离。较大的半径会使Agent与障碍物保持更大的距离。agentHeight:Agent能够通过的空间高度。Agent只能在高度大于等于其高度的区域中导航。agentMaxSlope:Agent能够导航的最大斜率角度。超过这个角度的斜坡将被视为不可通过的区域。agentMaxClimb:Agent能够攀爬的最大垂直高度。cellSize:导航网格的单元格大小。较小的值会生成更详细的导航网格,但会增加内存占用和计算成本。cellHeight:导航网格中每个单元格的高度。较小的值会在垂直方向上更精确地导航。tileSize:导航网格的瓦片大小。导航网格可以被划分为多个瓦片,以便在大型场景中更高效地生成和加载导航数据。
2.2 区域标记 areaFlag
用于标记当前导航表面的区域类型,如可行走区域(walk)、水(water)、不可行走区域(unwalk)等。区域标记会影响Agent在寻路时对不同区域的偏好和避让行为。
开发者可以通过点击open Area Settings打开配置界面,新增自定义的区域标记类型。
name:区域类型的名称,与区域标记处选项的名称一致。cost:指定Agent在导航时穿越该类型表面的相对代价。较高的值表示通过该表面的代价更高,Agent在寻路时会优先选择cost较低的路径。
2.3 异步烘焙 asyn
表示是否启用异步生成导航网格。当勾选时,导航网格的生成过程将在后台异步进行,不会阻塞主线程。启用异步生成可以保证在游戏运行时每帧只生成一个tile,提高场景加载和编辑的流畅性。
2.4 分区类型 partitionType
用于指定导航网格的分区方式,有三个选项:
Monotone(单调分割):生成速度快,占用内存少,适合简单场景。Watershed(流域分割):能更好地适应复杂场景,生成的导航网格更精确自然,但速度较慢、内存消耗较多。Layer(层次分割):按层次结构划分导航网格,适用于需要对不同区域应用不同寻路规则的场景。
2.5 数据 datas
点击Bake NavMesh按钮后,会对所有除动态节点外的可渲染节点及子节点模型进行烘焙。生成的结果(.bin文件)会保存到assets目录下新建的文件夹中(以模型所在场景命名),并自动添加到datas属性中。
注意:如果对场景节点的位置、旋转等进行了修改,都需要重新烘焙节点数据。烘焙出的导航网格不会跟随场景动态改变。数据不可存在预制体中,如果在预制体中拖入场景须重新烘焙数据。
2.6 最大简化误差 maxSimplificationError
定义简化多边形边框时允许的最大误差值,控制导航网格的简化程度。值越大,简化程度越高,性能越好但精确度降低;值越小,导航网格越精确但性能消耗更大。
三、常用API
| API | 描述 |
|---|---|
navMesh |
获取当前组件的导航网格对象 |
cleanAllTile() |
清除所有导航瓦片 |
rebuildTile(pos) |
重建指定位置处的导航瓦片 |
boundMin / boundMax |
获取导航网格的边界范围 |
findNavMeshSurface(surfaces, sprite, agentFlags) |
静态方法,在节点层级中查找匹配指定代理标记的所有NavMeshSurface组件 |