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