Exemple #1
0
        public static bool Serialize(NavMeshBuilder builder, out string json)
        {
            builder.Refresh();

            json = "";

            List <Vector3> allVerts = new List <Vector3>();
            List <int[]>   allPolys = new List <int[]>();

            foreach (var poly in builder.polys)
            {
                int[] indexs = new int[poly.vertices.Count];
                for (int i = 0; i < indexs.Length; i++)
                {
                    indexs[i] = allVerts.Count + i;
                }
                allVerts.AddRange(poly.vertices);
                allPolys.Add(indexs);
            }

            List <Vector3>        newVerts      = new List <Vector3>();
            Dictionary <int, int> indexOldToNew = new Dictionary <int, int>();

            for (int i = 0; i < allVerts.Count; i++)
            {
                int existedIndex = -1;
                for (int j = 0; j < newVerts.Count; j++)
                {
                    if (Vector3.Distance(allVerts[i], newVerts[j]) < 0.01)
                    {
                        existedIndex = j;
                        break;
                    }
                }
                if (existedIndex < 0)
                {
                    indexOldToNew[i] = newVerts.Count;
                    newVerts.Add(allVerts[i]);
                }
                else
                {
                    indexOldToNew[i] = existedIndex;
                }
            }
            foreach (var indexs in allPolys)
            {
                for (int i = 0; i < indexs.Length; i++)
                {
                    indexs[i] = indexOldToNew[indexs[i]];
                }
            }

            int polyCount = allPolys.Count;

            PolyNode[] polyNodes = new PolyNode[polyCount];
            for (int i = 0; i < polyCount; i++)
            {
                var      indexs = allPolys[i];
                PolyNode node   = new PolyNode();
                node.vertexs = new Vector2[indexs.Length];
                for (int j = 0; j < indexs.Length; j++)
                {
                    node.vertexs[j] = new Vector2(newVerts[indexs[j]].x, newVerts[indexs[j]].z);
                }
                node.center  = Math.CalculatePolyCenter2D(node.vertexs);
                polyNodes[i] = node;
                node.index   = i;

                // only support convex ploygons
                if (!Math.IsConvexPoly(node.vertexs))
                {
                    Debug.LogError("Polygon " + builder.polys[i].name + " is not a convex polygon.", builder.polys[i]);
                    return(false);
                }

                // make sure clockwise order
                if (!Math.IsClockwise2D(node.vertexs[0], node.vertexs[1], node.vertexs[2]))
                {
                    System.Array.Reverse(node.vertexs);
                    System.Array.Reverse(indexs);
                }
            }
            // find neighbors
            List <PolyNode> neighbors     = new List <PolyNode>();
            List <int>      neighborEdges = new List <int>();

            for (int i = 0; i < polyCount; i++)
            {
                var indexs = allPolys[i];
                neighbors.Clear();
                neighborEdges.Clear();
                for (int j = 0; j < polyCount; j++)
                {
                    if (i == j)
                    {
                        continue;
                    }
                    var indexs2      = allPolys[j];
                    int neighborEdge = -1;
                    for (int m = 0; m < indexs.Length; m++)
                    {
                        int e1 = indexs[m];
                        int e2 = indexs[m + 1 >= indexs.Length ? 0 : m + 1];
                        for (int n = 0; n < indexs2.Length; n++)
                        {
                            int e3 = indexs2[n];
                            int e4 = indexs2[n + 1 >= indexs2.Length ? 0 : n + 1];
                            if (e1 == e3 && e2 == e4 || e1 == e4 && e2 == e3)
                            {
                                neighborEdge = m;
                                break;
                            }
                        }
                        if (neighborEdge >= 0)
                        {
                            break;
                        }
                    }
                    if (neighborEdge >= 0)
                    {
                        neighbors.Add(polyNodes[j]);
                        neighborEdges.Add(neighborEdge);
                    }
                }
                polyNodes[i].neighbors     = neighbors.ToArray();
                polyNodes[i].neighborEdges = neighborEdges.ToArray();
            }

            NavMesh navMesh = new NavMesh();

            navMesh.polyNodes = polyNodes;

            json = NavMesh.Serialize(navMesh);
            Debug.Log(json);

            return(true);
        }