Navigation system由四部分组成:
1.NavMesh(Navigation Mesh的缩写)
数据结构。用于描述“可以行走的平面”的数据结构。
2.NavMesh Agent
组件。可以自动寻路的角色都需要带的一个组件
3.NavMesh Obstacle
组件。描述角色(agent)需要避开的动态障碍物。
4.Off-Mesh Link
组件。用于描述不能用一般的可行走平面描述的置,如可以跳过的沟渠或围栏,需要打开的门,都可以用Off-Meshnk描述。
有了上面四个东西,就可以实现自动寻路了。简单来说,首先,我们需要用NavMesh记录一下哪些面可以让我们的角色在上面走动,然后再给我们需要自动寻路的角色挂上NavMesh Agent就可以了。先来简单实现一下:
1.先创建一个Cube,并拉伸一下
2.打开创建NavMesh的窗口:Window->Navigation
3.打开Navigation窗口中的Object栏,然后选中我们创建的Cube,勾选Object栏中Navigation Static.(所有需要参与渲染的物体都要勾选上这个)
4.点击Bake栏中的bake按钮。
我们可以看见Cube上面出现了一块蓝色的面,这就是NavMesh在场景中的样子,也就是说蓝色部分是角色可以移动的面。
5.现在再创建一个角色,我们创建一个圆柱体代表一下。
正如前面说的,要给我们的角色添加一个agent组件。
6.emmm……..怎么还不动。。。因为还没告诉角色该往哪走。所以现在给角色添加一个脚本,用这个脚本来告诉他该往哪儿走。
注意:需要添加命名空间AI
destination属性是NavMesh Agent的目标点。
7.现在一切都准备就绪,运行起来。我们只要点击Cube蓝色区域,角色就会移动过去。
8.现在给场景中添加一些静态的障碍物,看他能否绕开他们到达目的地。添加几个Cube,然后调节他们的大小,在把他们在Object栏中的Navigation Static勾选上,最后点击一下Bake栏中的bake按钮。
9.运行:
10.再来试试斜面,角色是否可以正常移动上去
只要斜坡的倾斜度在要求内就可以Bake成功(倾斜度可以自己设置
)11.最后来用一下Link,我们放入两个高台用于实验,在创建两个空物体来标记link的起点和终点,实现的效果就是角色可以在起点和终点间转移。
offNavMeshLink组件挂在Link物体上。12.然后运行:
可以看到,offMeshLink是有效的,并且角色的AI会让他自动找到一条最短的路线到达目的地。(添加好组件,起点,终点即可,不需要再次bake)。在这个过程中通过用代码播放恰当的动画,既可以达到爬楼梯,跳跃等效果。
下面总结一下各部分的细节:
NavMesh窗口
1.打开NavMesh窗口:
Window->Navigation
1.2Object设置:(每个GameObject是单独的)
a.Scene Filter(过滤器):这个选项不是太要紧,可以通过Scene视图直接选中物体
All:在Hierarchy中显示所有GameObject
Mesh: 在Hierarchy中显示有Mesh Renderer组件的GamObject
Terrains: 在Hierarchy中显示所有Terrain
b.Navigation Static: 所有需要参与渲染的物体都要勾选。(也可以在物体的Inspector面板右上角的static旁的三角标处选中)
c.Generate OffMeshLinks :是否自动生成OffMeshLink(前面提到过的组件)(同样可以在inspector面板同上位置设置)
d.Navigation Area:生成的NavMesh的类型,用于区分不同的区域,地面,水,沼泽随你设置(可以在Areas设置)。
b.Navigation Static: 所有需要参与渲染的物体都要勾选。(也可以在物体的Inspector面板右上角的static旁的三角标处选中)
c.Generate OffMeshLinks :是否自动生成OffMeshLink(同样可以在inspector面板同上位置设置)
d.Navigation Area:生成的NavMesh的类型
1.3Bake设置
a.上半部分为图示
b.Agent Radius 决定agent的中心到墙或者边界最近的距离
c.Agent Height 决定agent 可以通过的最低的空间
d.Max Slope 决定 agent 可以爬得上的最陡的斜坡度数
e.Step Hight 决定agent 可以跨上的最高的台阶
f.Drop Height 当高度低于这个值时会自动生成OffMesh Link
g.Jump Distance 当跨度低于这个值时会自动生成OffMesh Link
h.Voxel Size 调整NavMesh的精度(一般默认即可)。
i.Min Region Area 会把单独存在的低于这个值的可行走区域剔除。有个列外:NavMesh是创建一些平行的小格子上的(Scene中能看到白线),如果一个面积比Min Region Area设置的小的面在格子线上时,将不会被剔除。
j.Height Mesh 勾选上时 agent上台阶时会一节一节上去(存在抖动),不勾选时,agent会平滑的上去
Bake 按钮:计算出可行走区域,计算完成后,可行走区域在Scene视图中会以蓝色的凸多边形表现,并且会在和Scene同名的文件夹中保存一份NavMesh的数据文件。
Clear 按钮: 清除NavMesh数据,会删除场景中的NavMesh多边形和文件夹中的NavMesh数据文件。1.4.Areas设置
Navigation Areas定义了不同的区域类型。在寻找路径时低的cost区域优先级将会更高。此外每个NavMesh Agent 有一个Area Mask属性可以选择该Agent可以移动的区域类型。
NavMesh Agent
1.Agent Type : 设置Agent类型,Agent类型在Navigation面板中的Agents中设置。
a.Name:Agent类型的名字
b.Radius: Agent半径,用于计算和其他agent和障碍物的碰撞
c.Height:可以走过的最低高度
2.Base offset: 圆柱碰撞体相对于transform原点的偏移
3.Speed:最快的移动速度
4.Angular Speed:最快的旋转速度
5.Accelerat : 最快的加速度
6.Stopping distance: 距离目标多近就会停止运动
7.Auto Barking: 刹车。当靠近目标点的时候会自动减速。如果在多个点之间巡逻,最高禁用这个。
8.Quality:障碍物躲避效果的质量。如果有很多的agent可以把这个调低来节省CPU。如果设置为none,那么只会处理碰撞而不会试图去避开。
9.Priority:在移动的时候,高优先级的Agent会把低优先级的Agent的撞开,且差距越多撞开效果越明显。
10.Auto Traverse OffMesh Link 勾选这个将会自动越过off-mesh Link。
11.Auto Repath: 当路线失效时会自动重新找一条路线,如果找不到了,就会找一个到最靠近目标点的路线。
12.Area Mask:选择此Agent可以移动的Area。
常用函数:
ActivateCurrentOffMeshLink 激活或禁止当前off-MeshLink.
CalculatePath 计算到某个点的路径并储存
CompleteOffMeshLink 完成当前offMeshLink的移动
Move 移动到相对于当前位置的点
ResetPath 清除当前路径
SetDestination 设置目标点
SetPath 设置一条路线
Warp 瞬移到某点
NavMesh Obstacle
Crave:当勾选此项,将会在NavMesh上挖一个洞。此项适合障碍物静止时。
Move Threshold:该参数代表该障碍物的移动的极限距离超过这个参数时,才会重新雕刻这个障碍物。
Time To Stationar: 障碍物静止不动多少时间后会重新雕刻导航网格
Carve Only Stationar:勾选此参数时,只有在障碍物静止时会对它导航网格进行雕刻。
Off-Mesh Link
Start: 开始的位置
End:结束的位置
Cost Override:
Bi Directional:是否双向都可以运动,若不勾选,只能start到End.
Activated:此link是否可以被自动路找到。
Auto Update Positions:若勾选,则当End点移动时会重新设置路线。否则,即使End点移动了路线也不会变动。
Navigation Area:定义此Link的area类型,可以通过agent中的mask判断该agent能否通过这个link。
虽然这个AI系统省去了我们的很多麻烦,但还是有些不方便的地方,如不能渲染出竖直方向的NavMesh,不能做到动态的Bake,不能去实现一些有趣的玩法和随机地图的生成功能,不过高级NavMesh将会完成Unity自带NavMesh未完成的使命。