让Unity NavMesh为我所用

Unity里面整合了一个NavMesh功能,虽然让人又爱又恨。

但当你在其他地方需要这个NavMesh的数据时,就更让人欲罢不能了。

比如说服务器需要Unity的NavMesh数据时。

比如说你想将Unity的场景导出到其他引擎时,比如时下流行的H5。

 

最近我就碰到了这样一个需求,走了一些弯路,研究了Unity的NavMesh

  1. 将Unity的NavMesh数据导出

先说代码,我编写了一个导出脚本,将navmesh数据可以导出成一个obj,也可以导出成一个json文件

你可以用svn 获取代码

http://code.taobao.org/svn/falconconv/trunk/babylonfan/webgl/res_navmeshexport

 

 

原理是Unity提供了一个接口可以得到NavMesh的三角形数据

这里直接有vertices 顶点,和 indices顶点索引

但是这个数据不可直接导出,这个数据不可直接导出这个数据不可直接导出。

导出来的三角形基本上都是不共边的,不共边怎么做连通图呢,这不行,所以要先分析他。

我已经帮你分析过了,这里unity发明了一个方法表达多边形,我没有搜到类似这样的做法,姑且认为是Unity发明的方法

 

Unity的NavMeshData有一些共边的三角形,共边的三角形其实不是连通关系,共边的三角形只是他们共同构成一个凸多边形,并且这种共边的三角形,全部都是扇形排列。

首先先以此划分,生成多边形列表。这个多边形列表,当然没有共边。

 

Unity的NavMeshData 那些不共边的多边形只是index索引不共边,从坐标上还是有共边的,所以我们合并掉重合顶点,重新排列多边形的index索引,就可以恢复到有共边的多边形列表和顶点列表

 

做了如上两步以后,我们就得到了原始的navmesh数据,有共边的多边形列表和顶点列表

然后将它写入obj文件或者json文件就可以了。

具体Unity的花招就是上面两步,代码可以拉svn研究。

二、外部使用这些数据

然后我们就可以脱离Unity来实现一个NavMesh了,到这里其实如果你接触过寻路,已经不用看了,如果你懒,接着往下看

 

我先在winform环境用c#实现了一个navmesh

你可以用svn拉取测试程序源码

http://code.taobao.org/svn/falconconv/trunk/babylonfan/webgl/navmesh_pathfinding_test

用导出的json文件画出了连通图,鼠标左右键,完成寻路。

Navmesh的寻路原理是两步

  1. 先用astar 算法从navmesh连通图找出经过的三角形,图中的灰色部分
  2. 用照射法在经过的三角形中找出一条路径

然后将c#代码移植为TypeScript代码,就将navmesh带到h5了

一样可以从svn拉取代码:

http://code.taobao.org/svn/falconconv/trunk/babylonfan/webgl/canvas/canvasWebgl_NavMesh

posted @ 2016-08-03 11:13  疯光无线  阅读(14181)  评论(9编辑  收藏  举报