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 扔給服務器,服務器進行怪物是否在三角形 范圍內判定。具體怎么做我不管了。

