Unity 导出NavMesh (可行走区域判定) 数据给服务器使用
Unity 导出NavMesh (可行走区域判定) 数据给服务器使用
Unity 导出NavMesh (可行走区域判定) 数据给服务器使用
发表于2016/9/26 18:15:11 1089人阅读
分类: Unity MMO
这个项目的客户端使用Unity 自带的 NavMesh 来做寻路。然后怪物的刷新以及移动是由服务器负责的,但是这样会有一个问题,如果怪物在场景边缘或者怪物与人之间有障碍物,服务器是又不知道这里有障碍物,那怪物的移动就没法做了。
转自http://blog.****.net/huutu http://www.thisisgame.com.cn 转自http://blog.****.net/huutu http://www.thisisgame.com.cn 转自http://blog.****.net/huutu http://www.thisisgame.com.cn 转自http://blog.****.net/huutu http://www.thisisgame.com.cn 转自http://blog.****.net/huutu http://www.thisisgame.com.cn 转自http://blog.****.net/huutu http://www.thisisgame.com.cn
所以有这么个需求,让服务器能够判定当前移动位置是否在可行走区域之内。
所以就需要把客户端的 NavMesh数据导出给服务器使用(或许有其它的办法)。
转自http://blog.****.net/huutu http://www.thisisgame.com.cn 转自http://blog.****.net/huutu http://www.thisisgame.com.cn
转自http://blog.****.net/huutu http://www.thisisgame.com.cn
Unity 提供了相关的接口:
NavMesh.CalculateTriangulation
利用这个接口能够获取到NavMesh 的数据,顶点以及顶点索引。
熟悉GL或DX的童鞋知道有了顶点以及顶点索引就可以画出模型来。
转自http://blog.****.net/huutu http://www.thisisgame.com.cn
转自http://blog.****.net/huutu http://www.thisisgame.com.cn
下面是我写的一个简单的示例,用来把NavMesh 数据导出到一个 obj 文件,obj 是一种文本形式存储的模型文件格式。导出之后直接拖到Unity 中可以看到NavMesh 的形状。
/************************************************
* 文件名:ExportNavMesh.cs
* 描述:导出NavMesh数据给服务器使用
* 创建人:陈鹏
* 创建日期:20160926
* http://blog.****.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.****.net/huutu http://www.thisisgame.com.cn
转自http://blog.****.net/huutu http://www.thisisgame.com.cn
点击Export 导出后,会生成以 当前 Scene 命名的 obj 文件
转自http://blog.****.net/huutu http://www.thisisgame.com.cn
拖到Unity 中绘制出来如下,证明我们成功导出了NavMesh的数据
转自http://blog.****.net/huutu http://www.thisisgame.com.cn
把这个 obj 扔给服务器,服务器进行怪物是否在三角形 范围内判定。具体怎么做我不管了。