Unity 高级NavMesh

Unity自带的NavMesh System虽然很方便,但有些功能仅靠它是难以实现的,幸好Unity 在 GitHub上的一个高级NavMesh插件可以弥补一些缺陷。

这个插件需要在GitHub上下载:点这里下载

使用时只需要将Assets/NavMeshCompoents导入项目中。

高级NavMesh主要分为四部分,也就是四个组件:

1.NavMesh Surface

它的作用Navigation窗口的作用类似,用来渲染出NavMesh,但是它比Navigation更见小巧便捷,而且需要参与渲染的物体不需要勾选Navigation Static,只需要是Collect Objects(见下图属性)中包括的物体且该物体所在层被包括在Include Layers(见下图属性)中即可。
这里写图片描述

Agent Type: agent的类型(依然在Navigation中设置)

Collect Objects:
All:烘培所有物体
Volume:烘培一定体积范围内的物体(会出现一个可调节大小的长方体)
Children:烘培这个组件所在物体的子物体(包括此物体)

Include Layers:烘培的层
Use Geometry: 使用哪个网格渲染,一般默认即可。
这里写图片描述

NavMesh Surface有个函数可以用来动态Bake:BuildNavMesh()。

你甚至可以用NavMesh Surface渲染好,然后把有NavMesh Surface组件的物体保存为prefab,就可以直接将渲染好的NavMesh像一个prefab一样使用。

还可以把NavMesh Surface挂在角色身上,动态的Bake,从而每次只渲染出角色附近的NavMesh节省资源

还需要注意的几点:

1.每次Bake会产生一个新的NavMesh文件,所以Bake之前先要clear一下,不然会多生成一个NavMesh文件

2.若是prefab,且prefab没有Bake好NavMesh,然后将场景中的对应物体bake后运行,会发现并没NavMesh。prefab的NavMesh必须apply才能有效,否则无效。

3.不同的NavMesh不可以直接相通,也就是说agent不能从一个NavMesh直接走到另一个NavMesh上,同一个prefab的不同物体上的NavMesh也是不可以相通的,即便他们相连或者相交,但是依靠NavMeshLink(下面)是可以达到从一个走到另一个上的。

NavMesh Link

它和offMeshLink一样,是用来创造不是简单平面的可行走区域。通过它也可以让Agent从一个NavMesh走到另一个NavMesh
这里写图片描述
Swap:起点和终点位置倒置
Align Transform: 将此物体的Transform中心放在起点和终点的中心
这里写图片描述

NavMesh Modifier

这里写图片描述
Igonre From Build:若勾选,将不会渲染此物体的NavMesh.
Override Area: 重写此物体及其子物体的Area Type。
Affected Agents:排除此物体对某一类agent的影响。

NavMesh Modifier Volume

可能NavMesh的某一部分需要设置成特别的Area Type,就可以使用这个Volume去包含所在的区域。
这里写图片描述

这里写图片描述

这里写图片描述