讓Unity NavMesh為我所用

瘋光無線發表於2016-08-03

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

相關文章