您的位置:首页 > 移动开发 > Unity3D

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

2017-08-25 00:22 537 查看

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

*要求版本5.6以上。

官方教程:Live Session: Runtime NavMesh Generation

使用插件:NavMeshComponents

实时导航另一个实例:Unity 使用 Runtime NavMesh(运行时导航)实现AI在场景变化时,重新计算路线

  在5.6版本之前,Unity自带的导航烘培场景需要在编辑时烘培(非运行时)。在5.6及其以后版本就可以实现运行时烘培场景,实现实时导航。而且同时可以使用多种导航代理模型(Agent。即不同宽高会有不同的烘培场景。)



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



编辑时场景。未烘培,游戏开始时,调用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 等。)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: