Skip to content

Commit

Permalink
新寻路导出方式
Browse files Browse the repository at this point in the history
  • Loading branch information
jzyong committed May 3, 2018
1 parent 294d983 commit f9bd1a2
Show file tree
Hide file tree
Showing 132 changed files with 642 additions and 161 deletions.
Binary file modified .vs/NavMeshDemo/v15/.suo
Binary file not shown.
Binary file not shown.
Binary file not shown.
10 changes: 10 additions & 0 deletions Assets/102_test.meta

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Binary file added Assets/102_test.unity
Binary file not shown.
9 changes: 9 additions & 0 deletions Assets/102_test.unity.meta

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Binary file added Assets/102_test/NavMesh.asset
Binary file not shown.
10 changes: 10 additions & 0 deletions Assets/102_test/NavMesh.asset.meta

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Binary file added Assets/New Terrain 2.asset
Binary file not shown.
10 changes: 10 additions & 0 deletions Assets/New Terrain 2.asset.meta

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Binary file added Assets/map/map101/NavMesh.asset
Binary file not shown.
10 changes: 10 additions & 0 deletions Assets/map/map101/NavMesh.asset.meta

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

10 changes: 10 additions & 0 deletions Assets/map/map102.meta

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Binary file added Assets/map/map102.unity
Binary file not shown.
9 changes: 9 additions & 0 deletions Assets/map/map102.unity.meta

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Binary file added Assets/map/map102/NavMesh.asset
Binary file not shown.
10 changes: 10 additions & 0 deletions Assets/map/map102/NavMesh.asset.meta

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Binary file added Assets/map/xingzouceng.prefab
Binary file not shown.
10 changes: 10 additions & 0 deletions Assets/map/xingzouceng.prefab.meta

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Binary file modified Assets/map1200.unity
Binary file not shown.
5 changes: 3 additions & 2 deletions Assets/map1200.unity.meta

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

226 changes: 226 additions & 0 deletions Assets/src/PolygonNavMeshWindow.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,226 @@
using UnityEngine;
using UnityEditor;
using UnityEditor.SceneManagement;
using System.IO;
using System.Text;

/// <summary>
/// 导出navmesh寻路层
/// </summary>
public class PolygonNavMeshWindow : EditorWindow
{
private int mapID; //地图id
private GameObject pathMesh; //寻路网格对象

//地图坐标范围
public int startX=0;
public int startZ=0;
public int endX=300;
public int endZ=300;

[MenuItem("地图/多边形地图")]
static void ShowToolWindow()
{
Rect rect = new Rect(0, 0, 500, 400);
PolygonNavMeshWindow window = (PolygonNavMeshWindow)EditorWindow.GetWindowWithRect(typeof(PolygonNavMeshWindow), rect, true, "多边形寻路数据生成");
window.Show();
}


public void Show()
{
base.Show();
Init();
}

/// <summary>
/// 初始化
/// </summary>
public void Init()
{
try
{
ClearTemp();
string secenName=EditorSceneManager.GetActiveScene().name.Trim();
char[] keys = { '_' };
mapID = int.Parse(secenName.Split('_')[0]);

//寻路层先根据标记查找,如果失败根据名称
pathMesh= GameObject.FindGameObjectWithTag("terrain");
if (pathMesh == null)
{
pathMesh = GameObject.Find("model_xzm_" + mapID);
}
if (pathMesh == null)
{
Debug.LogError("寻路层找不到,请确定tag设为terrain或名称设为model_xzm_地图id");
Close();
return;
}
}
catch(System.Exception)
{
Close();
}
}

private void OnDestroy()
{
mapID = 0;
pathMesh = null;
}

/// <summary>
/// 绘制工具面板
/// </summary>
private void OnGUI()
{
EditorGUILayout.LabelField("1.寻路层设置标记为terrain或名称为model_xzm_地图id");
EditorGUILayout.LabelField("2.导出数据请刚好圈住寻路层");
EditorGUILayout.Separator();
EditorGUILayout.LabelField("地图ID:" + mapID);
startX = EditorGUILayout.IntField("起始X",startX);
startZ = EditorGUILayout.IntField("起始Z", startZ);
endX = EditorGUILayout.IntField("结束X", endX);
endZ = EditorGUILayout.IntField("结束Z", endZ);
EditorGUILayout.LabelField("宽度:" + (endX - startX));
EditorGUILayout.LabelField("高度:" + (endZ - startZ));
if (GUILayout.Button("测试大小"))
{
CreateMapTestMesh();
}

EditorGUILayout.Separator();
if (GUILayout.Button("生成服务器数据"))
{
if (EditorSceneManager.GetActiveScene().name.Contains(mapID.ToString()))
{
CreatePolyNavMesh();
}
}

EditorGUILayout.Separator();

if (GUILayout.Button("重载配置"))
{
Init();
}
}

/// <summary>
/// 创建网格数据
/// </summary>
private void CreatePolyNavMesh()
{
UnityEngine.AI.NavMeshTriangulation triangulatedWalkNavMesh = Path();
string path = System.Environment.CurrentDirectory.Replace("\\", "/") + "/../Config/Nav_build/";
if (!Directory.Exists(path))
{
Directory.CreateDirectory(path);
}
StringBuilder sb = new StringBuilder("{");
sb.Append("\"mapID\":").Append(mapID);
sb.Append(",\"startX\":").Append(startX).Append(",\"startZ\":").Append(startZ);
sb.Append(",\"endX\":").Append(endX).Append(",\"endZ\":").Append(endZ);
string filename = path + mapID + ".navmesh";

string data = "";
data = PathMeshToString(triangulatedWalkNavMesh);
sb.Append(",").Append(data);
sb.Append("}");
MeshToFile(filename, sb.ToString());
}

/// <summary>
/// 清除临时对象
/// </summary>
public void ClearTemp()
{
GameObject mapTest=GameObject.Find("MapTest");
if (mapTest != null)
{
Object.DestroyImmediate(mapTest);
}
}

/// <summary>
/// 创建测试网格
/// </summary>
private void CreateMapTestMesh()
{
GameObject ob= GameObject.Find("MapTest");
if (ob == null)
{
ob= new GameObject("MapTest");
ob.AddComponent<MeshFilter>();//网格
ob.AddComponent<MeshRenderer>();//网格渲染器

}
Mesh mesh = new Mesh();
mesh.vertices = new Vector3[]
{
new Vector3(startX, 0, startZ),
new Vector3(startX, 0, endZ+startZ),
new Vector3(endX+startX, 0, endZ+startZ),
new Vector3(endX+startX, 0, startZ)
};
mesh.triangles = new int[] { 0, 1, 2, 0, 2, 3 };
ob.GetComponent<MeshFilter>().sharedMesh = mesh;
}

/// <summary>
/// 计算行走层三角网格
/// </summary>
/// <returns></returns>
private UnityEngine.AI.NavMeshTriangulation Path()
{
ClearTemp();
pathMesh.GetComponent<Renderer>().enabled = true;
UnityEditor.AI.NavMeshBuilder.ClearAllNavMeshes();
UnityEditor.AI.NavMeshBuilder.BuildNavMesh();
UnityEngine.AI.NavMeshTriangulation triangulatedNavMesh = UnityEngine.AI.NavMesh.CalculateTriangulation();


return triangulatedNavMesh;
}

/// <summary>
/// 寻路数据转换为字符串
/// </summary>
/// <param name="mesh"></param>
/// <returns></returns>
private string PathMeshToString(UnityEngine.AI.NavMeshTriangulation mesh)
{
if (mesh.indices.Length < 1)
{
return "";
}
StringBuilder sb = new StringBuilder();
sb.Append( "\"pathTriangles\":[");
for (int i = 0; i < mesh.indices.Length; i++)
{
sb.Append(mesh.indices[i]).Append(",");
}
sb.Length--;
sb.Append("],");

sb.Append("\"pathVertices\":[");
for (int i = 0; i < mesh.vertices.Length; i++)
{
Vector3 v = mesh.vertices[i];

sb.Append("{\"x\":").Append(v.x).Append(",\"y\":").Append(v.y).Append(",\"z\":").Append(v.z).Append("},");
}
sb.Length--;
sb.Append("]");
return sb.ToString();
}

static void MeshToFile(string filename, string meshData)
{
using (StreamWriter sw = new StreamWriter(filename))
{
sw.Write(meshData);
}
}
}
13 changes: 13 additions & 0 deletions Assets/src/PolygonNavMeshWindow.cs.meta

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Empty file added Library/CrashedAssetImports.txt
Empty file.
Loading

0 comments on commit f9bd1a2

Please sign in to comment.