Unity动态加载NavMesh

效果

QQ20180114-190238-HD

新版本的Unity可以将NavMeshData存成一个Prefab,在任意场景(即使不是同一个项目).动态的加载进来.或者在编辑模式加载均可.

步骤

手先从Github上面Check下来适合自己IDE的插件: 地址

使用其内置的NavMeshSurface配合其他的Component生成对应的NavMeshData.

注意:不要使用Navigation标签下的Bake按钮生成NavMesh. 该标签下生成的NavMesh是旧版本,只能用于生成的场景.

QQ20180114-191550

生成的NavMesh会在场景所在的层级下面同名文件夹内

名字为NavMesh- + GameObject的名字

QQ20180114-191649

加载代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class AddNavMeshOnStart : MonoBehaviour
{
public NavMeshData navMeshData;

private NavMeshDataInstance mInstance;

private void Start()
{
if (navMeshData != null)
{
mInstance = NavMesh.AddNavMeshData(navMeshData, transform.position, transform.rotation);
Debug.Log("Add nav mesh data");
}
}
}

核心代码就是NavMesh.AddNavMeshData(xxxx). 如果是想Runtime加载,就放在Start里面.如果是想编辑模式就加载则可以加入[ExecuteInEditMode]标签.然后onEnable时候调用.

注意: 在编辑模式下加载则使用Navigation标签下的Clean是无法清除已经加载的NavMesh的
需要自己写代码使用NavMesh.RemoveNavMeshData(xxxx);手动清楚掉

用处

对我个人而言,新版的NavMesh 主要用于 编辑场景和游戏场景分开. 在编辑场景中制作地图,地图中会绑定许多为了做NavMesh而加入的Object.

基于原来的NavMesh系统

一种方案是 编辑结束后,复制整个场景删除无用的GameObject,把当前场景作为游戏场景.
另一种方案就是 在场景上绑定清理代码. 在Play的第一帧清除掉无用的GameObject.

第一种方案麻烦的地方在于场景的反复编辑,每次都要执行复制删除.第二种方案在于刚开始Play时候要删GameObject,使得初始化时候会卡.

新的NavMesh可以完美解决这个问题.

坚持原创技术分享,您的支持将鼓励我继续创作!