unity导航系统

                                                                导航系统

Unity 中有一个专门用于实现导航寻路功能的 Navigation 系统。
这个系统由三个组件和一个 Navigation 总控制面板组成。

一.导航系统介绍
1.现实生活中的导航系统
游戏是什么?游戏是创造一个虚拟的世界,在这个虚拟的世界,所有的东西,我
们在现实生活中都能找到它们的影子,比如导航系统。
智能手机上的百度地图,高德地图,本身就是一个导航系统。
导航的本质:
导航系统能帮助我们从 A 点(出发点)到达 B 点(目的地)。
从 A 点到 B 点可能有 N 条路,导航系统会帮我们选出最快捷最方便的那条路。
现实生活中的导航系统是这样的,虚拟世界中的导航系统同样也是这样的。

2.Unity 中的导航系统
Unity 中的导航系统是由“A*算法”延伸扩展实现的。
由三个导航组件,一个控制面板组成。通过导航系统,我们可以实现类似于现实
生活中的导航。

二.导航系统步骤

1.准备测试场景
①.创建地面,角色,目的地位置,搭建一个简单的场景。

②.调整以上三者的位置信息【见图】。


2.烘焙导航场景
地面上哪些位置角色是可以行走的,我们是需要标示处理的,如何处理那?
①.将地面勾选 static,变成静态物体(场景中只有静态物体才能参与烘培)


②.在unity导航栏点击Window-->Navigation-->Bake-->Bake,烘焙导航场景。
也就是说“标示出角色可以移动行走的范围”,烘焙完毕后,会出现一个和场景
同名的文件夹,保存导航网格烘焙的数据。


3.导航寻路组件
我们的角色要在烘焙过的范围内实现导航,角色身上需要添加一个导航组件(NavMeshAgent(导航网格代理器))。

由该组件负责实现导航功能

①.选中角色在unity导航栏点击Component-->Navigation-->Nav Mesh Agent添加该组件。

 
②创建脚本命名为Player控制该组件移动到导航目的地。

三:NavMeshAgent 组件参数分析

1.Steering[操作]
Speed[速度]:导航的移动速度;
Angular Speed[转弯速度]:模型是Z轴朝向目标点;如果不是,则转向;
Acceleration[加速度]:保持默认即可;
Stopping Distance[停止距离]:距离目的地多远的时候停止;
Auto Braking[自动停止]:保持默认勾选状态即可(备注:我这边的unity版本是2017.2,经过测试发现勾选和未勾选没有区别);

2.Obstacle Avoidance[障碍回避]

Radius[半径]:控制代理器这个“圆柱体”的半径,也就是大小;
Height[高度]:控制代理器这个“圆柱体”的高度;

Qualty[质量]:避障质量。如果您拥有大量代理,则可以通过降低避障质量来节省CPU时间。将避免设置为无,只会解决冲突,但不会尝试主动避免其他代理和障碍。(备注:这是官方的解释,本人也为做过测试)

priority[优先级]:执行避免时,此代理将忽略优先级较低的代理。该值应在0-99范围内,其中较低的数字表示较高的优先级。

如何区分哪个是导航代理器那?[见图]

Base Offset[基础偏移]:控制代理器这个“圆柱体”在垂直方向的偏移量;

四:Navigation面板之Bake参数

1.Baked Agent Size[烘焙代理器大小]
①Agent Radius[代理器半径]
场景中有静态障碍物的时候,烘焙出来的网格和障碍物之间有一定的“留白”。
这个留白的目的是避免角色导航的时候与障碍物相撞,避免产生“穿帮”。
代理器是一个“圆柱体”形状,且在导航的时候是以圆柱体的中心点为移动点的。
所以说这里的 Agent Radius 其实是设置“留白”的宽度;值越大,留白的宽
度也就越大,反之亦然。
这个参数是要配合场景中角色的具体尺寸来进行调整烘焙的。

测试准备:

1.创建一个Cube模型。

2.调整位置和缩放。

3.勾选静态选项。

4.将Agent Radius的参数调整为0.7。

5.点击Navigation面板的Bake按钮。

6.运行测试后在将Agent Radius的参数调整为0.5,然后在次运行测试,观察效果和差距。

 ②.Agent Height[代理器的高度]
当场景中的导航出现上下层的时候,比如楼房的多个楼层的地面。
当楼层与楼层之间的距离比 Agent Height 的高度还要小的时候,这个区间内
就不会生成导航网格。
这个参数也是要配合场景中角色的具体尺寸来进行调整烘焙的。

测试准备:

1.创建一个Cube模型

2.调整位置和缩放

3.勾选静态选项

4.将Agent Height选项的参数值调整为1

5.点击Navigation面板的Bake按钮

6.运行测试后在将Agent Height的参数调整为2,然后在次运行测试,观察效果和差距。

③.Max Slope[最大爬坡能力] 

当场景中的导航地面有斜坡的时候,控制低于多少度的斜坡可以导航攀爬。

测试准备:

1.创建Cube模型

2.调整位置和缩放

3.勾选静态选项

4.将Max Slopet选项的参数值调整为40

5.点击Navigation面板的Bake按钮

6.调整终点的位置

7.运行测试后在将Max Slope的参数调整为45,然后在次运行测试,观察效果和差距。

④.Step Height[台阶高度]
当场景中出现台阶的时候,控制多高的台阶角色可以导航。
但是这个台阶的高度不能高于 Agent Height 的高度。

这一步大家有兴趣可以自己搭建台阶配合参数调整观察效果,步骤同上!
备注说明:
这四个参数都是要配合场景的具体环境来进行设置的。
而且这四个参数是与 NavMeshAgent 组件相关的。

Object面板参数介绍

选中任意一个勾选了静态选项的模型【见图】

Navigation Static:当前模型是否参与了“导航系统”;
Generate OffMeshLinks:生成“网格跳跃线”(关于这个选项请继续往下观看)
Navigation Area:导航区域,代表当前有哪些区域是可以行走的,是一个枚举。

 五:Navigation面板之Areas选项参数

①.Areas 简介
在现实生活中,是有不同的“地形路况”的。
比如:草地,沙漠,沼泽,湖泊,河流等等,我们人在这些不同的地形上行走,
感觉是不一样的,对于人来说,有“这个路好走”和“这个路不好走”之分。
A 点到 B 点有两条路,一条是公路,一条是沙漠,100%的人都会选择走公路,
因为这个公路好走,并且公路比沙漠更安全。
在Unity里面我们可以通过Navigation面板中的Areas功能来定义不同的地
形路况。

②.Unity 内置地形路况
Unity 内置(Built-in)了三种地形:可行走,不可行走,跳跃。
我们创建的所有参与导航系统烘焙的模型,默认都是“可行走路况”。

③.Unity 用户地形路况
Unity 除去内置的三种地形外,还允许用户根据自己的实际开发要求来自定义最
多 29 种不同的地形路况,分别是 User3~User31。

测试准备:

1.调整地面的缩放X轴为1.1,按住Ctrl+D复制出来一份,调整Z轴位置为16

2.按住Ctrl+D复制出来三份分别命名为Grass(草地)、River(河流)、以及Desert(沙漠)

3.调整位置【见图】

4.移动终点的位置【见图】

5.切换到Navigation面板选择Areas选项 ,填写对应的名字【见图】

6.选择Object选项分别为Grass、River、Desert设置导航区域【见图】 

根据以上步骤更改其它俩个! 

7.最后点击Bake按钮烘培导航网格

8.运行测试,测试后你会发现角色会选择River(河流)这条路径行走,那是因为河流这条路距离终点是最近的,但是在现实生活中,我们往往会选择草地这条路径去行走,那么如何让角色沿着草地这条路径去行走呐?(继续往下看)

②.Cost 代价
代价,在这条路上行走需要消化的“代价”,这里的代价可以是体力,可以是金
币,同样的道路长度,代价越高,被选中的可能性越低。

修改Navigation面板Areas选项卡Cost的值,然后运行测试。【见图】

 六:OffMeshLink  组件基本使用

①.OffMeshLink 组件介绍
Off Mesh Link:分离网格跳跃线。
当我们场景中存在两块独立的烘焙导航区域的时候,之间有很大的间距,角色要
想在两块区域之间继续导航的话,就需要“一座桥梁”来连接两块区域。
而 Off Mesh Link 组件,就是这座桥梁。

测试准备:

1.创建一个Cube模型,调整位置和缩放【见图】

2.调整终点的位置【见图】 

3.创建开始点和结束点并调整位置和缩放【见图】 

4.往开始点或者结束点任意一个物体身上添加 OffMeshLink 组件并设置起点和终点【见图】

5.运行测试,查看效果。

②.OffMeshLink 面板属性 

1.Start 和 End
用于设置“跳跃线”的开始点和结束点,两点成线。

2.Cost Override [代价覆盖]
定义角色通过这个“跳跃线”所要付出的代价是多少。
默认值是-1,代表角色通过该跳跃线不需要代价。
注意:这里的代价覆盖的是“Navigation Area”参数指定的地形代价。


3.Bi Directional [双向跳跃线]
该属性是一个复选框,如果勾选,则角色可以在两点之间来回的跳跃移动;
如果不勾选,则只是单行道,只能从开始点跳跃到结束点。

4.Activated [激活状态]
用于设置该跳跃线是否激活,是否可用。
激活状态:跳跃线为深蓝色;未激活状态:跳跃线为暗红色。

5.Auto Update Positions[自动更新位置]
如果勾选该参数,则表示自动更新位置,我们在运行状态的时候,是可以动态的
改变开始点或者结束点的位置的,同时跳跃线也会动态的更新,反之亦然。

③.OffMeshLink 注意事项
1.开始点和结束点可以是模型,也可以是空物体,只需要具备 Transform 组件
即可;
2.开始点和结束点不需要静态,因为这个“跳跃线”不需要参与 Navigation
面板上的网格烘焙;
3.开始点和结束点不能距离烘焙出来的导航网格太远;
开始点和结束点的位置是有两个圆圈的,如果没有圆圈说明这个位置点距离烘焙
出来的导航网格太远,需要手动调进它们之间的距离。

七:NavMeshObstacle组件基本使用

①.NavMeshObstacle 组件介绍
Nav Mesh Obstacle:导航网格障碍物。
在角色的导航范围内,如果说需要出现障碍物,我们一般是将这些障碍物设置为
静态,一起参与 Navigation 的导航烘焙;这样的话,我们的角色在导航的时
候,就不会与这些障碍物模型相碰撞。
但是如果说我们需要一些“动态的导航障碍物”,这些障碍物模型不设置静态,
不参与烘焙,甚至是通过代码实例化出来的模型动态的添加到我们的导航地形
中,我们就需要用到一个新的组件了,这个组件就是 Nav Mesh Obstalce。

②.NavMeshObstacle 面板属性
1.Shape[形状]
控制障碍物的形状,正方体或者胶囊体。
注意:这个障碍物可以是一个空物体,我们就是通过这个 Shape 属性来控制这
个障碍物的范围。


2.Carve[雕刻]
只有勾选了该属性,这个障碍物才会生效。
勾选上该属性后,会出现如下三个可以控制的参数:


Move Threshold:[移动阈值]
大于该值的移动,才认为是真正发生了移动。


Time To Stationary:[时间静止]
每间隔多长时间,检查一次该障碍物的位置,如果发生了移动则动态的更新导航
网格的数据。


Carve Only Stationary:[仅雕刻静止物体]
勾选后,则按上面的时间间隔,固定的检查位置,固定时长更新网格数据;
如果不勾选,则是每帧都会检查位置,如果发生位移,立刻更新网格数据。

测试准备:

1.创建一个Cube模型并调整位置和缩放,往模型身上添加一个NavMeshObstacle组件 【见图】

2.运行测试,观看效果 

八:OffMeshLinks自动生成

①.OffMeshLinks 简介
在之前,我们讲解过 Off Mesh Link 这个组件,指定两个位置点,就
可以在两点之间生成“跳跃线”。
那么 Off Mesh Links 是什么那??
Off Mesh Links 不是一个组件,它是 Navigation 面板上的导航烘焙参数,
但是基本功能和 Off Mesh Link 是完全一样的,不同点是 Off Mesh Link 是
需要我们手动一个一个的设置,而 Off Mesh Links 则可以批量生成。

②.OffMeshLinks 使用
1.基础说明
在 Navigation 面板的 Bake 选项中有一个“Generated Off Mesh Links”
这么一组设置选项,我们就是通过这个区域的来控制如何自动生成跳跃线。
2.Drop Height [落差]
在多高的落差之间生成跳跃线。落差:指的是垂直方向。
默认值为 0,表示该选项无效;
设置成其他的数字,比如 2,则会在落差 2 以内的区域内自动生成跳跃线。
注意:这时生成的跳跃线是单向的,高处往低处跳跃。
3.Jump Distance [跳跃距离]
在多远的距离之间生成跳跃线。距离:指的是水平方向。
默认值为 0,表示该选项无效;
设置成其他的数字,比如 2,则会在距离 2 以内的区域内自动生成跳跃线。
注意:这时生成的跳跃线也是单向的,但是,距离方向的跳跃线往往是成组生成,
所以还是可以双向移动的。

这个属性的设置各位可以自行测试。

此文章只是为了记录一下学习笔记,如有不足还望多多指点! 

猜你喜欢

转载自blog.csdn.net/weixin_39923777/article/details/83050732