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 扔给服务器,服务器进行怪物是否在三角形 范围内判定。具体怎么做我不管了。

 

posted on 2017-04-09 18:32  jiahuafu  阅读(3054)  评论(0编辑  收藏  举报

导航