Unity Runtime NavMesh(运行时导航)总结,实现AI可以导航到墙壁(天花板)

发表于2018-01-04
评论0 2.7k浏览

在NavMeshComponents 5.6版本之前,Unity自带的导航烘培场景需要在编辑时烘培(非运行时)。在5.6及其以后版本就不需要了,可以实现运行时烘培场景,实现实时导航。而且同时可以使用多种导航代理模型(Agent。即不同宽高会有不同的烘培场景。)下面就通过一个例子看看实现AI可以导航到墙壁(天花板)的方法。

 
机器人从墙面导航到天花板上。

 
编辑时场景。未烘培,游戏开始时,调用NavMeshSurface.BuildNavMesh() 来烘培场景。


主要的四个组件

组件名作用
NavMeshSurface导航面。用来烘培场景。
NavMeshLink导航面连接。Off Mesh Link加强版,连接两个可导航面。
NavMeshModifier导航更改。就是可以修改部分特殊的导航物体。(是否可以在其上面导航,指定物体可以导航等。)
NavMeshModifierVolume同上。不过是指定一个区域。

NavMeshSurface

变量名作用
Agent Type导航代理类型(不同宽高、移动旋转速度、爬坡角度),在Navigation窗口设置。
Collect Objects从哪些物体上烘培导航场景。下面详解。
Include Layers包含哪些的层级。
Use Geometry使用哪种网格来烘培场景。1.Render Meshs:有MeshRenderer组件的。2.Physics Colliders:有物理Collider组件的。

  点击Bake烘培场景。如果要运行时烘培场景,调用其方法:BuildNavMesh()。更新烘培场景:UpdateNavMesh(NavMeshData data)。

Collect Objects

1. All

  场景中有所物体都会拿来烘培,不管物体在哪里,在哪个层级。如下图。一个外部立方体上面是可以导航的。 

2. Children

  只有自己及其子层级的物体才会加入烘培。如下图,立方体不是自己的孩子时。 

3. Volume

  指定区域内才会烘培(不管是不是自己的孩子)。如下图,区域内切割了立方体。 


NavMeshLink

 
  通过两点连接两个面(控制Width可以形成类似桥面的连接面)。这两个面都必须可以导航得到(淡蓝色表面),连接成功会预览得到白色的桥面。

 
(地面和墙面连接,导航就可以从地面导航到墙面了)


NavMeshModifier & NavMeshModifierVolume

 
(对应下图右桥) 
- Ignore From Build : 烘培时是否无视他(不加入烘培)。 
- Override Area : 重写该区域(是否可以走,是否要跳过)。 
- Affected Agents :这些设置影响到的导航代理。

 
(对应下图左桥) 
同上,只是改变区域内物体。

 
(烘培后,右边的桥被无视,左边有一块区域不能走。)

*在导航到无法到达的地方时候,像教程中的循环墙面,可能会有BUG:点每个墙面上房间的墙面时,导航是错误的(结果不是导航到房间墙面旁边,而是垂直房间墙面最近的地面的点)。

建议下载插件源码(标题处链接)看样例,有更清楚的实时导航,其中用NavMeshSourceTag组件标记一个物体就可以实现实时产生可导航的物体表面(当然还要配合其他组件如:Local Nav Mesh Builder 等。)

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引

标签:

0个评论