/// <summary> /// 创建导航网格 /// </summary> public void CreateNavMesh() { Debug.Log("start..."); List <Triangle> lstTri = new List <Triangle>(); this.m_lstTriangle.Clear(); int startTriID = 0; for (int i = 0; i < NavEditAreaManager.sInstance.m_lstAreaGroup.Count; i++) { NavEditAreaGroup group = NavEditAreaManager.sInstance.m_lstAreaGroup[i]; lstTri.Clear(); List <Polygon> areas = GetUnWalkAreas(group.m_lstArea); Debug.Log(areas.Count + " polygon count"); NavResCode genResult = NavMeshGen.sInstance.CreateNavMesh(areas, ref startTriID, i, ref lstTri); foreach (Triangle item in lstTri) { this.m_lstTriangle.Add(item); } if (genResult != NavResCode.Success) { Debug.LogError("faile"); } } Debug.Log("triangle count " + this.m_lstTriangle.Count); Debug.Log("end!"); }
//========================= save or load navmesh ========================= /// <summary> /// Saves the nav mesh. /// </summary> /// <param name="path">Path.</param> public void SaveNavMesh(string path) { NavResCode code = NavMeshGen.sInstance.SaveNavMeshToFile(path, this.m_lstTriangle); if (code != NavResCode.Success) { Debug.LogError("save navmesh error: " + code.ToString()); } }
/// <summary> /// Loads the nav mesh. /// </summary> /// <param name="path">Path.</param> public void LoadNavMesh(string path) { List <Triangle> lst; NavResCode code = NavMeshGen.sInstance.LoadNavMeshFromFile(path, out lst); this.m_lstTriangle = lst; if (code != NavResCode.Success) { Debug.LogError("load navmesh error: " + code.ToString()); } }
/// <summary> /// 从文件中读取导航网格信息 /// </summary> /// <param name="filePath">文件全路径</param> /// <param name="navTriangles">读取的导航网格</param> /// <returns></returns> public NavResCode LoadNavMeshFromResource(string filePath, out List <Triangle> navTriangles, GetResources GetRes) { navTriangles = new List <Triangle>(); BinaryReader binReader = null; MemoryStream stream = null; if (GetRes == null) { if (!File.Exists(filePath)) { return(NavResCode.FileNotExist); } // open file FileStream fs = File.Open(filePath, FileMode.Open); binReader = new BinaryReader(fs); } else { UnityEngine.Object FileObject = GetRes(filePath); if (FileObject == null) { return(NavResCode.FileNotExist); } TextAsset asset = (TextAsset)FileObject; stream = new MemoryStream(asset.bytes); binReader = new BinaryReader(stream); } NavResCode res = NavResCode.Failed; try { res = LoadNavMeshFromFile(ref navTriangles, binReader); } catch { } finally { binReader.Close(); if (GetRes != null) { stream.Close(); } } return(res); }
/// <summary> /// 创建导航网格 /// </summary> public void CreateNavMesh() { LogManager.Log("开始创建导航网格..."); List <Polygon> areas = GetUnWalkAreas(); NavResCode genResult = NavMeshGen.Instance.CreateNavMesh(areas, ref allNavMeshData); if (genResult != NavResCode.Success) { LogManager.LogError("创建导航网格失败"); } else { LogManager.Log("创建导航网格成功!"); } }
/// <summary> /// 加载导航网格 /// </summary> /// <param name="filePath"></param> public void LoadNavMesh(string filePath) { if (filePath.Length == 0) { LogManager.LogError("加载路径不能为空"); } else { NavResCode loadResult = NavMeshGen.Instance.LoadNavMeshFromFile(filePath, out allNavMeshData); if (loadResult != NavResCode.Success) { LogManager.LogError("加载导航网格失败"); } else { LogManager.Log("加载导航网格成功!"); } } }
public void HandleNavMeshDownload(System.Object obj, AssetBundle assetSrc) { List <Triangle> allNavMeshData = new List <Triangle>(); if (assetSrc == null) { return; } TextAsset asset = assetSrc.Load(currSceneName + ".NavMesh") as TextAsset; MemoryStream stream = new MemoryStream(asset.bytes); BinaryReader binReader = new BinaryReader(stream); NavResCode res = NavResCode.Failed; try { res = NavMeshGen.Instance.LoadNavMeshFromFile(ref allNavMeshData, binReader); } finally { binReader.Close(); stream.Close(); } if (res != NavResCode.Success) { LogManager.LogError("加载导航网格失败"); } else { PathFinder.Instance.NavMeshData = allNavMeshData; LogManager.Log("加载导航网格成功!"); } ////////////////////////////////////////////////////////////////////////// // 检查是否在自动寻路 [8/9/2011 ivan edit] Interface.GameInterface.Instance.AutoMoveNavReady(); }
/// <summary> /// 保存导航网格 /// </summary> /// <param name="filePath"></param> public void SaveNavMesh(string filePath) { if (allNavMeshData.Count == 0) { LogManager.LogError("必须先创建导航网格"); } else if (filePath.Length == 0) { LogManager.LogError("保存路径不能为空"); } else { NavResCode saveResult = NavMeshGen.Instance.SaveNavMeshToFile(filePath, allNavMeshData); if (saveResult != NavResCode.Success) { LogManager.LogError("保存导航网格失败"); } else { LogManager.Log("保存导航网格成功!"); } } }
/// <summary> /// 创建导航网格 /// </summary> /// <param name="polyAll">所有阻挡区域</param> /// <param name="triAll">输出的导航网格</param> /// <returns></returns> public NavResCode CreateNavMesh(List <Polygon> polyAll, ref int id, int groupid, ref List <Triangle> triAll) { triAll.Clear(); List <Line2D> allLines = new List <Line2D>(); //线段堆栈 //Step1 保存顶点和边 NavResCode initRes = InitData(polyAll); if (initRes != NavResCode.Success) { return(initRes); } int lastNeighborId = -1; Triangle lastTri = null; //Step2.遍历边界边作为起点 { Line2D sEdge = startEdge; allLines.Add(sEdge); Line2D edge = null; do { //Step3.选出计算出边的DT点,构成约束Delaunay三角形 edge = allLines[allLines.Count - 1]; allLines.Remove(edge); Vector2 dtPoint; bool isFindDt = FindDT(edge, out dtPoint); if (!isFindDt) { continue; } Line2D lAD = new Line2D(edge.GetStartPoint(), dtPoint); Line2D lDB = new Line2D(dtPoint, edge.GetEndPoint()); //创建三角形 Triangle delaunayTri = new Triangle(edge.GetStartPoint(), edge.GetEndPoint(), dtPoint, id++, groupid); // 保存邻居节点 // if (lastNeighborId != -1) // { // delaunayTri.SetNeighbor(lastNeighborId); // if(lastTri != null) // lastTri.SetNeighbor(delaunayTri.ID); // } //save result triangle triAll.Add(delaunayTri); // 保存上一次的id和三角形 lastNeighborId = delaunayTri.GetID(); lastTri = delaunayTri; int lineIndex; //Step4.检测刚创建的的线段ad,db;如果如果它们不是约束边 //并且在线段堆栈中,则将其删除,如果不在其中,那么将其放入 if (!Line2D.CheckLineIn(allEdges, lAD, out lineIndex)) { if (!Line2D.CheckLineIn(allLines, lAD, out lineIndex)) { allLines.Add(lAD); } else { allLines.RemoveAt(lineIndex); } } if (!Line2D.CheckLineIn(allEdges, lDB, out lineIndex)) { if (!Line2D.CheckLineIn(allLines, lDB, out lineIndex)) { allLines.Add(lDB); } else { allLines.RemoveAt(lineIndex); } } //Step5.如果堆栈不为空,则转到第Step3.否则结束循环 } while (allLines.Count > 0); } // 计算邻接边和每边中点距离 for (int i = 0; i < triAll.Count; i++) { Triangle tri = triAll[i]; //// 计算每个三角形每边中点距离 //tri.calcWallDistance(); // 计算邻居边 for (int j = 0; j < triAll.Count; j++) { Triangle triNext = triAll[j]; if (tri.GetID() == triNext.GetID()) { continue; } int result = tri.isNeighbor(triNext); if (result != -1) { tri.SetNeighbor(result, triNext.GetID()); } } } return(NavResCode.Success); }