Unity Runtime NavMesh(运行时导航)总结,实现AI可以导航到墙壁(天花板)
在NavMeshComponents 5.6版本之前,Unity自带的导航烘培场景需要在编辑时烘培(非运行时)。在5.6及其以后版本就不需要了,可以实现运行时烘培场景,实现实时导航。而且同时可以使用多种导航代理模型(Agent。即不同宽高会有不同的烘培场景。)下面就通过一个例子看看实现AI可以导航到墙壁(天花板)的方法。
机器人从墙面导航到天花板上。
编辑时场景。未烘培,游戏开始时,调用NavMeshSurface.BuildNavMesh() 来烘培场景。
组件名 | 作用 |
---|---|
NavMeshSurface | 导航面。用来烘培场景。 |
NavMeshLink | 导航面连接。Off Mesh Link加强版,连接两个可导航面。 |
NavMeshModifier | 导航更改。就是可以修改部分特殊的导航物体。(是否可以在其上面导航,指定物体可以导航等。) |
NavMeshModifierVolume | 同上。不过是指定一个区域。 |
变量名 | 作用 |
---|---|
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
指定区域内才会烘培(不管是不是自己的孩子)。如下图,区域内切割了立方体。
通过两点连接两个面(控制Width可以形成类似桥面的连接面)。这两个面都必须可以导航得到(淡蓝色表面),连接成功会预览得到白色的桥面。
(地面和墙面连接,导航就可以从地面导航到墙面了)
(对应下图右桥)
- Ignore From Build : 烘培时是否无视他(不加入烘培)。
- Override Area : 重写该区域(是否可以走,是否要跳过)。
- Affected Agents :这些设置影响到的导航代理。
(对应下图左桥)
同上,只是改变区域内物体。
(烘培后,右边的桥被无视,左边有一块区域不能走。)
*在导航到无法到达的地方时候,像教程中的循环墙面,可能会有BUG:点每个墙面上房间的墙面时,导航是错误的(结果不是导航到房间墙面旁边,而是垂直房间墙面最近的地面的点)。
建议下载插件源码(标题处链接)看样例,有更清楚的实时导航,其中用NavMeshSourceTag组件标记一个物体就可以实现实时产生可导航的物体表面(当然还要配合其他组件如:Local Nav Mesh Builder 等。)