Unity 导出NavMesh (可行走区域判定) 数据给服务器使用

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 阅读(...) 评论(...) 编辑 收藏