Unity 導出NavMesh (可行走區域判定) 數據給服務器使用


img cp790621656
博客專家

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

 


免責聲明!

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



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