Unity里面整合了一个NavMesh功能,虽然让人又爱又恨。
但当你在其他地方需要这个NavMesh的数据时,就更让人欲罢不能了。
比如说服务器需要Unity的NavMesh数据时。
比如说你想将Unity的场景导出到其他引擎时,比如时下流行的H5。
?
最近我就碰到了这样一个需求,走了一些弯路,研究了Unity的NavMesh
-
将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的寻路原理是两步
- 先用astar 算法从navmesh连通图找出经过的三角形,图中的灰色部分
- 用照射法在经过的三角形中找出一条路径
然后将c#代码移植为TypeScript代码,就将navmesh带到h5了
一样可以从svn拉取代码:
http://code.taobao.org/svn/falconconv/trunk/babylonfan/webgl/canvas/canvasWebgl_NavMesh