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