Skip to main content
AR论坛
 首页 » 资源教程 » Unity3D教程

【Unity】12.1 基本概念

2016年11月06日 15:28:091830

一、简介

导航网格(Navmesh)是世界坐标系中几何体的简化表示,被游戏代理用来进行全局导航。通常,代理有一个目标或一个目的地,它试图找到通往该目标或目的地的路径,然后沿着该路径导航到该目标,这个过程称为寻路(Path Finding)。

注意,导航网格生成(或烘培)通常由游戏开发者在编辑器内完成,而寻路通常由代理在运行时根据该导航网格来完成。

在复杂的游戏世界中,可以有许多代理和动态障碍物,由于这些动态障碍物在世界几何体的不同区域(Area)不断变化,因此代理需要对这些变化作出动态反应。换言之,代理的寻路任务可能被一些事物打断或受到其影响,例如避免与其他角色发生碰撞、随时有可能变化的地形特征、物理障碍物的动态变化(比如关门)和实际目的地的更新等。

二、导航寻路的基本过程

1、基本步骤

以下步骤简单介绍了如何设置导航网格以及代理如何在导航网格上寻路:

(1)在关卡中创建一些几何体,例如平面 (Plane) 或地形 (Terrain),然后在检视器窗口 (Inspector) 的右上角单击静态 (Static),对于Unity 5.x来说,当Static左侧变为“√”时,再单击其右边的下拉框,可看到默认情况下,该几何体的下列选项都被选中了:

【Unity】12.1 基本概念 Unity3D教程 第1张

也可以将其改为仅勾选导航静态 (Navigation Static):

【Unity】12.1 基本概念 Unity3D教程 第2张

在上面的截图中,Inspector右边的【Navigation】标签是通过【Window】->【Navigation Mesh】打开的导航网格窗口。在该标签页窗口中,可以设置烘培参数,设置完成后单击【烘焙(Bake)】按钮,就会产生所有导航“静态”几何体的导航网格。

(2)在场景中创建一些“动态”几何体(比如角色),然后通过向场景中的动态几何体添加 NavMeshAgent 组件,就可以为该几何体创建一个代理(或多个代理)。

(3)在附加到代理的脚本中,为代理提供一个目的地,这样就可以在Unity编辑器中通过为脚本设置目的地属性来指定导航目标。

(4)单击【播放】按钮,就可以观看动态几何体自动导航寻路的动画过程。

注意,还可以自定义 NavMesh 层。如需让代理更轻松地通过环境中的某些地方(相对于其他地方),则可能需要这些层。

对于没有直接连接的网格部分,可以生成分离的网格链接(Off Mash Link Generation),即将这些不连续的网格一个接一个地链接起来,从而进一步实现寻路的功能。

2、烘培(Bake)及其属性

对于标记为静态(static)的对象,通过【Window】->【Navigation Mesh】打开导航网格窗口后,即在【Navigation】视图的【Bake】标签页中设置对其进行烘培的参数:

【Unity】12.1 基本概念 Unity3D教程 第3张

以下是影响导航网格 (Navmesh) 烘焙结果的属性:

【Agent Radius】:“典型”代理的半径(最好是最小值)。

【Agent Height】:“典型”代理的高度(角色通过所需的“空隙”)。

【Max Slope】:最大坡度。坡度大于此值的所有表面会予以丢弃。

【Step height】:台阶高度。当相邻网格的高度之差低于台阶高度时,则认为连接至导航网格区域。

【Drop height】:下落高度。如果该属性值是正数,则将为高度差小于该值的相邻导航网格表面放置分离网格链接。

【Jump distance】:跳跃距离。如果该属性值是正数,则将为水平距离小于该值的相邻导航网格表面放置分离网格链接。

【Min Region Area】:最小区域面积。面积小于该阈值的区域将予以丢弃。

【Height Mesh】:高度网格。如果勾选此选项,原始高度信息会存储起来。这会对速度和内存性能造成一定影响。

注意,烘焙后的导航网格会变为场景的一部分,代理就是通过它来导航的。要删除导航网格,在烘焙 (Bake) 选项卡中单击【Clear】按钮即可。

3、细节解释

烘焙导航网格 (Navmesh) 时,它会将Navmesh映射到 XZ 平面中的方格中。可视化方格时,其边框被视为导航网格 (Navmesh) 上的亮蓝色轴对齐线。Unity 在一个场景中最多支持 1024 个方格,每个方格用 1000x100 个像素表示。如果打算让代理在大区域中导航,需要注意导航网格 (Navmesh) 的大小和最终的网格数。

【Unity】12.1 基本概念 Unity3D教程 第4张

代理半径 (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 米)。


评论列表暂无评论
发表评论