Unity 導出NavMesh (可行走區域判定) 數據給服務器使用
發表於2016/9/26 18:15:11 1089人閱讀
分類: Unity MMO
這個項目的客戶端使用Unity 自帶的 NavMesh 來做尋路。然后怪物的刷新以及移動是由服務器負責的,但是這樣會有一個問題,如果怪物在場景邊緣或者怪物與人之間有障礙物,服務器是又不知道這里有障礙物,那怪物的移動就沒法做了。
轉自http://blog.csdn.net/huutu http://www.thisisgame.com.cn 轉自http://blog.csdn.net/huutu http://www.thisisgame.com.cn 轉自http://blog.csdn.net/huutu http://www.thisisgame.com.cn 轉自http://blog.csdn.net/huutu http://www.thisisgame.com.cn 轉自http://blog.csdn.net/huutu http://www.thisisgame.com.cn 轉自http://blog.csdn.net/huutu http://www.thisisgame.com.cn
所以有這么個需求,讓服務器能夠判定當前移動位置是否在可行走區域之內。
所以就需要把客戶端的 NavMesh數據導出給服務器使用(或許有其它的辦法)。
轉自http://blog.csdn.net/huutu http://www.thisisgame.com.cn 轉自http://blog.csdn.net/huutu http://www.thisisgame.com.cn
轉自http://blog.csdn.net/huutu http://www.thisisgame.com.cn
Unity 提供了相關的接口:
NavMesh.CalculateTriangulation
利用這個接口能夠獲取到NavMesh 的數據,頂點以及頂點索引。
熟悉GL或DX的童鞋知道有了頂點以及頂點索引就可以畫出模型來。
轉自http://blog.csdn.net/huutu http://www.thisisgame.com.cn
轉自http://blog.csdn.net/huutu http://www.thisisgame.com.cn
下面是我寫的一個簡單的示例,用來把NavMesh 數據導出到一個 obj 文件,obj 是一種文本形式存儲的模型文件格式。導出之后直接拖到Unity 中可以看到NavMesh 的形狀。
/************************************************ * 文件名:ExportNavMesh.cs * 描述:導出NavMesh數據給服務器使用 * 創建人:陳鵬 * 創建日期:20160926 * http://blog.csdn.net/huutu/article/details/52672505 * ************************************************/ using UnityEngine; using System.Collections; using UnityEditor; using System.IO; using UnityEngine.SceneManagement; public class ExportNavMesh { [MenuItem("NavMesh/Export")] static void Export() { Debug.Log("ExportNavMesh"); NavMeshTriangulation tmpNavMeshTriangulation = NavMesh.CalculateTriangulation(); //新建文件 string tmpPath = Application.dataPath + "/" + SceneManager.GetActiveScene().name + ".obj"; StreamWriter tmpStreamWriter = new StreamWriter(tmpPath); //頂點 for (int i=0;i<tmpNavMeshTriangulation.vertices.Length;i++) { tmpStreamWriter.WriteLine("v "+ tmpNavMeshTriangulation.vertices[i].x+" "+ tmpNavMeshTriangulation.vertices[i].y+" "+ tmpNavMeshTriangulation.vertices[i].z); } tmpStreamWriter.WriteLine("g pPlane1"); //索引 for (int i = 0; i < tmpNavMeshTriangulation.indices.Length;) { tmpStreamWriter.WriteLine("f " + (tmpNavMeshTriangulation.indices[i]+1) + " " + (tmpNavMeshTriangulation.indices[i+1]+1) + " " + (tmpNavMeshTriangulation.indices[i+2]+1)); i = i + 3; } tmpStreamWriter.Flush(); tmpStreamWriter.Close(); Debug.Log("ExportNavMesh Success"); } }
轉自http://blog.csdn.net/huutu http://www.thisisgame.com.cn
轉自http://blog.csdn.net/huutu http://www.thisisgame.com.cn
點擊Export 導出后,會生成以 當前 Scene 命名的 obj 文件
轉自http://blog.csdn.net/huutu http://www.thisisgame.com.cn
拖到Unity 中繪制出來如下,證明我們成功導出了NavMesh的數據
轉自http://blog.csdn.net/huutu http://www.thisisgame.com.cn
把這個 obj 扔給服務器,服務器進行怪物是否在三角形 范圍內判定。具體怎么做我不管了。