导航网格和导航组件有关

这个导航组件有啥用呢? --- 答案就是用来进行寻路的

这个导航组件不仅帮我们获取对应的导航信息,而且还会帮我们进行位置的移动

有了导航组件的话,我们的游戏物体将会具有自动绕过障碍物的能力,以及在绕过障碍物的前提下计算最短路径的能力

(如何让摄像机拍摄的游戏画面和我们在场景中看到的一样呢? --- 选中摄像机然后按 ctrl + shift + f 就能将我们选中的摄影机拍摄的游戏画面和我们在场景中开到的画面同步)

给定一个区域,开始实现导航:


一.让导航系统对整个区域进行扫描计算,算出这个区域中那里是可以走的,那里是不可以走的

计算完后,导航会以网格的方式将可以走的区域覆盖,不可以走的区域就不覆盖(计算结果可视化)

第一步的实现方式:

1.将要扫描的区域在层级面板处全部选中,选中后在检查面板中点击静态的右边的那个小三角,然后选择静态导航(navigation static)

用了导航的unity物体做动画无法离开怎么办 unity 地图导航_代理类

 选择后在跳出的询问选项中选择确定

2.点击窗口(windows),选择AI,选择navigation(导航)

用了导航的unity物体做动画无法离开怎么办 unity 地图导航_优先级_02

 选择好后就能够在inspector检查面板中看到下面这个标签页

用了导航的unity物体做动画无法离开怎么办 unity 地图导航_游戏引擎_03

选择烘焙

用了导航的unity物体做动画无法离开怎么办 unity 地图导航_unity_04

 

 所谓的代理半径和代理高度,其实这些参数都是一个圆柱体的参数,AI算法会根据这些参数生成一个圆柱体,而这个圆柱体就是用来作为人形模型的替代品的(也就是所谓的代理)

然后AI算法会根据这样的一个“圆柱体”人来对选中的区域进行计算,并生成可行走网格

(计算逻辑是只要这个圆柱体人能够走过去的都可以生成导航网格)

然后还有一个最大坡度(这个“圆柱体”人能够走上的最大的坡度),然后还有一个步高(“圆柱体”人每一步最多可以抬多高 --- 如果台阶高度高于步高的话,则这个圆柱体人就走不上这个台阶了)

3.设置好各项圆柱体人参数之后直接选择Bake进行烘焙,生成导航网格

用了导航的unity物体做动画无法离开怎么办 unity 地图导航_优先级_05

 上图就是烘焙完成之后的导航网格效果(蓝色较深的部分就是AI自动生成的导航网格)

解释一个现象,为什么导航网格处会出现边框呢?

当我们角色的重心(中心)部分来到边框线的时候(如下图的胶囊),我们的角色(圆柱体人)的边缘就和整个地图的边缘重合了,此时圆柱体人再往前移动一步的话就会导致角色(圆柱体人)掉出地图,所以边框外的部分都被识别为不可行走,所以会没有网格覆盖

总之有边框的地方都是圆柱体人会掉出去,卡住无法前进到的,被挡住的,跳不出去的地方

用了导航的unity物体做动画无法离开怎么办 unity 地图导航_碰撞检测_06

 

用了导航的unity物体做动画无法离开怎么办 unity 地图导航_unity_07

clear按钮具有清楚当前烘焙好的导航网格的功能 


开始使用导航功能:

1.创建一个游戏物体,并给这个组件挂载一个导航分类里面的 Nav Mesh Agent :导航网格代理组件(Nav是navigation的缩写)

用了导航的unity物体做动画无法离开怎么办 unity 地图导航_碰撞检测_08

 humanoid(人形) --- 选择导航类型中的导航设置选项,然后点击代理选项来设置替换游戏物体人形的“圆柱体人”的参数

用了导航的unity物体做动画无法离开怎么办 unity 地图导航_代理类_09

 在这个代理选项处我们可以点击上面那个横条下面的加号来添加新的圆柱体人(并且我们可以给这个圆柱体人命名) --- 其实这个圆柱体人的官方名字是导航代理

设置好导航代理之后我们就可以在代理类型中选择不同的导航代理来使用了

用了导航的unity物体做动画无法离开怎么办 unity 地图导航_游戏引擎_10

代理类型中的导航代理都是我们自己添加和创建的(除了第一个的Humanoid导航代理是默认创建的的) 

当我们给一个游戏物体选择了导航代理之后,这个游戏物体就会具有两个碰撞检测边框了

用了导航的unity物体做动画无法离开怎么办 unity 地图导航_优先级_11

 一个是圆柱体人的碰撞边框,一个是游戏物体本身具有的碰撞边框

当我们调节导航网格代理组件中的基准偏移X参数的时候,我们可以让圆柱体人的碰撞边框垂直移动(上下移动)

用了导航的unity物体做动画无法离开怎么办 unity 地图导航_unity_12

速度是圆柱体人移动的最大速度;角速度是圆柱体人转动的最大速度;加速就是加速度,是每秒速度的增加量;停止距离就是当圆柱体人停下来时的刹车距离(做减速运动时的位移);选择自动刹车后,我们的游戏物体会在到达目标点后自动停下来

用了导航的unity物体做动画无法离开怎么办 unity 地图导航_优先级_13

这个半径和我们的导航代理的圆柱体人的半径一致

质量:质量越高躲避效果越好 

优先级:当只有一个路口,但是有两个在进行导航的游戏物体要通过时,谁的优先级高谁就先通过


2.在游戏物体上创建一个脚本来控制游戏物体的移动

声明一个导航网格代理组件变量来承接挂载到游戏物体上的导航网格代理组件对象

在声明这个对象的时候需要我们引入一个命名空间:

 

用了导航的unity物体做动画无法离开怎么办 unity 地图导航_unity_14

 

用了导航的unity物体做动画无法离开怎么办 unity 地图导航_优先级_15

创建好变量后获取游戏物体上对应的组件对象并将其赋值给变量

用了导航的unity物体做动画无法离开怎么办 unity 地图导航_碰撞检测_16

 然后通过射线检测的方式获取鼠标点击位置

用了导航的unity物体做动画无法离开怎么办 unity 地图导航_碰撞检测_17

 如果按下鼠标,就根据鼠标按下的位置创建一个射线,并用射线变量来承接这个射线

然后创建一个射线信息类来承接射线的碰撞信息

然后对射线进行碰撞检测,将射线的碰撞点位置设为物体导航移动的终点

设为导航移动终点的方法就在上面