Ejemplo n.º 1
0
        /// <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!");
        }
Ejemplo n.º 2
0
//========================= 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());
            }
        }
Ejemplo n.º 3
0
        /// <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());
            }
        }
Ejemplo n.º 4
0
        /// <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);
        }
Ejemplo n.º 5
0
    /// <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("创建导航网格成功!");
        }
    }
Ejemplo n.º 6
0
 /// <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("加载导航网格成功!");
         }
     }
 }
Ejemplo n.º 7
0
    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();
    }
Ejemplo n.º 8
0
 /// <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("保存导航网格成功!");
         }
     }
 }
Ejemplo n.º 9
0
        /// <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);
        }