1. 程式人生 > >Unity 匯出NavMesh 可行走區域判定 資料給伺服器使用

Unity 匯出NavMesh 可行走區域判定 資料給伺服器使用

               

這個專案的客戶端使用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 扔給伺服器,伺服器進行怪物是否在三角形 範圍內判定。具體怎麼做我不管了。


           

再分享一下我老師大神的人工智慧教程吧。零基礎!通俗易懂!風趣幽默!還帶黃段子!希望你也加入到我們人工智慧的隊伍中來!https://blog.csdn.net/jiangjunshow