开发环境:Win十、Unity5.3.四、C#、VS2015 编辑器
建立日期:2016-05-09 性能
导航网格(Navmesh)是世界坐标系中几何体的简化表示,被游戏代理用来进行全局导航。一般,代理有一个目标或一个目的地,它试图找到通往该目标或目的地的路径,而后沿着该路径导航到该目标,这个过程称为寻路(Path Finding)。 动画
注意,导航网格生成(或烘培)一般由游戏开发者在编辑器内完成,而寻路一般由代理在运行时根据该导航网格来完成。 3d
在复杂的游戏世界中,能够有许多代理和动态障碍物,因为这些动态障碍物在世界几何体的不一样区域(Area)不断变化,所以代理须要对这些变化做出动态反应。换言之,代理的寻路任务可能被一些事物打断或受到其影响,例如避免与其余角色发生碰撞、随时有可能变化的地形特征、物理障碍物的动态变化(好比关门)和实际目的地的更新等。 代理
一、基本步骤 对象
如下步骤简单介绍了如何设置导航网格以及代理如何在导航网格上寻路: blog
(1)在关卡中建立一些几何体,例如平面 (Plane) 或地形 (Terrain),而后在检视器窗口 (Inspector) 的右上角单击静态 (Static),对于Unity 5.x来讲,当Static左侧变为“√”时,再单击其右边的下拉框,可看到默认状况下,该几何体的下列选项都被选中了: 游戏
也能够将其改成仅勾选导航静态 (Navigation Static):内存
在上面的截图中,Inspector右边的【Navigation】标签是经过【Window】->【Navigation Mesh】打开的导航网格窗口。在该标签页窗口中,能够设置烘培参数,设置完成后单击【烘焙(Bake)】按钮,就会产生全部导航“静态”几何体的导航网格。 游戏开发
(2)在场景中建立一些“动态”几何体(好比角色),而后经过向场景中的动态几何体添加 NavMeshAgent 组件,就能够为该几何体建立一个代理(或多个代理)。
(3)在附加到代理的脚本中,为代理提供一个目的地,这样就能够在Unity编辑器中经过为脚本设置目的地属性来指定导航目标。
(4)单击【播放】按钮,就能够观看动态几何体自动导航寻路的动画过程。
注意,还能够自定义 NavMesh 层。如需让代理更轻松地经过环境中的某些地方(相对于其余地方),则可能须要这些层。
对于没有直接链接的网格部分,能够生成分离的网格连接(Off Mash Link Generation),即将这些不连续的网格一个接一个地连接起来,从而进一步实现寻路的功能。
二、烘培(Bake)及其属性
对于标记为静态(static)的对象,经过【Window】->【Navigation Mesh】打开导航网格窗口后,即在【Navigation】视图的【Bake】标签页中设置对其进行烘培的参数:
如下是影响导航网格 (Navmesh) 烘焙结果的属性:
【Agent Radius】:“典型”代理的半径(最好是最小值)。
【Agent Height】:“典型”代理的高度(角色经过所需的“空隙”)。
【Max Slope】:最大坡度。坡度大于此值的全部表面会予以丢弃。
【Step height】:台阶高度。当相邻网格的高度之差低于台阶高度时,则认为链接至导航网格区域。
【Drop height】:下落高度。若是该属性值是正数,则将为高度差小于该值的相邻导航网格表面放置分离网格连接。
【Jump distance】:跳跃距离。若是该属性值是正数,则将为水平距离小于该值的相邻导航网格表面放置分离网格连接。
【Min Region Area】:最小区域面积。面积小于该阈值的区域将予以丢弃。
【Height Mesh】:高度网格。若是勾选此选项,原始高度信息会存储起来。这会对速度和内存性能形成必定影响。
注意,烘焙后的导航网格会变为场景的一部分,代理就是经过它来导航的。要删除导航网格,在烘焙 (Bake) 选项卡中单击【Clear】按钮便可。
三、细节解释
烘焙导航网格 (Navmesh) 时,它会将Navmesh映射到 XZ 平面中的方格中。可视化方格时,其边框被视为导航网格 (Navmesh) 上的亮蓝色轴对齐线。Unity 在一个场景中最多支持 1024 个方格,每一个方格用 1000x100 个像素表示。若是打算让代理在大区域中导航,须要注意导航网格 (Navmesh) 的大小和最终的网格数。
代理半径 (Agent Radius) 的默认设置为 0.5,宽度偏差 (Width Inaccuracy) 的默认设置为0.16666667 (16.666667%)。默认设置的方格边长可计算为:
1000 * (2*半径) * 宽度偏差 = 1000 * (2*0.5) * 0.16666667 = 166.66667。
增长宽度偏差 (Width Inaccuracy) 将容许容纳更大的面积,但这样作会下降导航网格 (Navmesh) 的精度。
例如,若是网格有 32 x 32 个方格,则将拥有 1024 个方格。这意味着,若是拥有想与导航网格 (Navmesh) 配合使用的真正巨大地形,按照默认设置,该地形面积不得超过 5.333 乘以 5.333 公里(32 * 166.66667 米)。