版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Rhett_Yuan/article/details/79483387
继上一篇编译过Recast源码之后,已经顺利运行起来我们的寻路工具,默认的数据目录下有两个dungeon.obj和nav_test.obj两个数据,因此我们看到RecastDemo用的数据是obj格式的,那么怎样从Unity中导出我们要用的obj数据呢
从wiki源码上下载这两个文件ObjExporter.cs和EditorObjExporter.cs(点击打开链接),放在自己工程的Editor目录下,选择一个网格对象,在菜单栏中选择导出即可,查看ObjExporter文件源码
using UnityEngine;
using System.Collections;
using System.IO;
using System.Text;
public class ObjExporter {
public static string MeshToString(MeshFilter mf) {
Mesh m = mf.mesh;
Material[] mats = mf.renderer.sharedMaterials;
StringBuilder sb = new StringBuilder();
sb.Append("g ").Append(mf.name).Append("\n");
foreach(Vector3 v in m.vertices) {
sb.Append(string.Format("v {0} {1} {2}\n",v.x,v.y,v.z));
}
sb.Append("\n");
foreach(Vector3 v in m.normals) {
sb.Append(string.Format("vn {0} {1} {2}\n",v.x,v.y,v.z));
}
sb.Append("\n");
foreach(Vector3 v in m.uv) {
sb.Append(string.Format("vt {0} {1}\n",v.x,v.y));
}
for (int material=0; material < m.subMeshCount; material ++) {
sb.Append("\n");
sb.Append("usemtl ").Append(mats[material].name).Append("\n");
sb.Append("usemap ").Append(mats[material].name).Append("\n");
int[] triangles = m.GetTriangles(material);
for (int i=0;i<triangles.Length;i+=3) {
sb.Append(string.Format("f {0}/{0}/{0} {1}/{1}/{1} {2}/{2}/{2}\n",
triangles[i]+1, triangles[i+1]+1, triangles[i+2]+1));
}
}
return sb.ToString();
}
public static void MeshToFile(MeshFilter mf, string filename) {
using (StreamWriter sw = new StreamWriter(filename))
{
sw.Write(MeshToString(mf));
}
}
在RecastDemo中加载这个obj文件即可