關於 Unity NavMesh 數據的導出和使用


  上周的工作重點轉移到服務器尋路上來,剛剛做完沒幾天,總結一下,當時團隊討論的結果是使用 Unity 原生的 NavMesh 系統,然后將數據導出到服務器使用。我最初的思路是將導出的網格加載到服務器后,自己寫 A* 算法來尋路,但看了 RecastNavigation 后,果斷放棄想法,想使用已導出的數據到 RecastNavigation 中使用,按照作者的簡介是可以,但是並沒有相關的代碼,后來翻到了一篇關於這個的帖子,作者明確回答說沒有時間做這個功能,所以就只能自己動手,豐衣足食了,有這么個系統已經很棒了。

  第一步工作就是分析 RecastNavigation 的工作流,我后來着重分析了 rcPolyMesh 的結構,計划並利用通過普通 Mesh 生成 rcPolyMesh,然后再生成 dtNavMesh 的過程,只要 dtNavMesh 生成就可以保存真正的導航數據了。

  第二部就開始嘗試將任意的 Mesh 轉換成 rcPolyMesh,這一步最主要的過程是生成相應的多邊形以及它們的鄰邊,你可以把所有的多邊形都用 Mesh 的三角形替代,但是可能導致最終的 NavMesh 並不是最優化的,並且通過試驗發現,三角形過多,多邊形過細,反而出現了尋路不精確的情況,不知道是否是我的數據有問題,我的方法是先用上述方法把每個多邊形設置為基礎的三角形,然后用內建的函數來優化合並多邊形,接着再建立鄰邊即可,這樣就可以得出最優化的 NavMesh 最終數據。

  第三部僅限於使用 Unity 導出的 NavMesh 的情況,這里發現了很有意思的問題,Unity 在導出 NavMesh 的接口里做了一點小小的 Smart Trick,這里面的 Mesh 數據是包含 NavMesh 中得多邊形 Poly 信息的!是的,你沒有看錯!我也是走了彎路才發現這個,因為當你直接用第二部的方法將 Unity 導出的 NavMesh 到 RecastNavigation 中,發現整個 Mesh 的內部出現了好多的 Outer Border,這說明這些邊和其它多邊形沒有公共邊,可是明明肉眼是能看到非常確定他們是共享某條被標記為 Outer Border 的邊的,查了多遍建立鄰邊算法(一開始是自己寫的)確實沒有問題,后來猜測唯一的原因應該是出現了重復頂點-多個頂點具有相同的位置,將其原始數據導入到 Max 中發現果然如此!將數據導出成 obj,打開文件也發現了相同頂點數值。既然這樣,你當然可以利用這些信息來建立多邊形,這樣多邊形信息和 Unity 中會一模一樣,是最完美的結果,很可惜迫於時間的壓力我暫時沒想到合適的分析算法,選擇了第二種方案:在進行第二步之前,先將 Unity 導出的 NavMesh 中相同數值的頂點進行合並,然后再優化合並多邊形,建立鄰邊,這樣可能最終的多邊形未必和 Unity 中一樣,但是並不影響尋路,而且也足夠優化,是目前性價比最高的方案。

  目前局限:不支持 DetailMesh(上述情況 DetailMesh 和 NavMesh 是相同的),不支持 OffMeshLink,但目前夠我們的項目使用了,而且效果也非常理想。感興趣的朋友可以按照上述方法嘗試。

  另外:RecastNavigation 有非常好的 Demo 和代碼注釋,但是幾乎沒有什么文檔來講解整個 Pileline 后面的原理,但找到了個 CritterAI 系統,一個基於 RecastNavigation 系統,用 C# 實現的 AI 尋路系統,有着非常詳細的文檔,對理解 RecastNavigation 有很大的幫助。我自己也在學習整個系統,還有很多地方還不理解有待挖掘。

  文檔地址:

    http://critterai.org/projects/cainav/doc/

  關於理解 NavMesh 生成:

    http://critterai.org/projects/cainav/doc/html/6fb3041b-e9be-4f03-868b-dcac944df19b.htm

    http://critterai.org/projects/cainav/doc/html/e72bd1ee-04b0-4bbb-a21d-d8d7ecaa11af.htm

    http://critterai.org/projects/cainav/doc/html/21046960-3dc1-4369-a092-5f5bba4f752c.htm

  關於 PolyMesh 的理解,尤其是其有關多邊形信息的格式,對於理解 rcPolyMesh 非常關鍵:

    http://www.critterai.org/projects/cainav/doc/html/DE9679E3.htm

    http://www.critterai.org/projects/cainav/doc/html/B8C2F0F4.htm

  一則關於 Mesh 導入轉換成 NavMesh 的討論帖子:

    https://groups.google.com/forum/#!topic/critterai/WY1mj9mz5AE

  一則關於作者說不添加導入普通 Mesh 到 NavMesh 功能的討論貼子:

    https://groups.google.com/forum/#!searchin/recastnavigation/import/recastnavigation/PJbyOPUtcaU/KoyGUkExkl8J

  這幾天又開始轉移到客戶端,做其它的功能了,大家還得繼續加油。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM