Esempio n. 1
0
    //Not meant for real-time use
    public void ConstructGraph()
    {
        if (meshGraph == null)
        {
            Debug.Log("No mesh to operate on! Please set meshGraph before calling this function");
            return;
        }
        //Create a sampler Gameobject to perform raycasts to neighboring nodes
        Sampler = new GameObject("Sampler");
        List <int>      neighbors;
        List <int>      DeadVertices = new List <int>();
        List <pathNode> DeadNodes    = new List <pathNode>();

        simpleGraph = new GraphSimple();
        simpleGraph.AddNodes(meshGraph.vertexCount);

        float dist = 0;

        for (int i = 0; i < meshGraph.vertexCount; i++)
        {
            //if(DeadVertices.Contains(i))
            //continue;

            neighbors = GetNeighbors(i);

            pathNode currentNode = simpleGraph.graph[i];
            currentNode.position = transform.TransformPoint(meshGraph.vertices[i]);


            for (int j = 0; j < neighbors.Count; j++)
            {
                dist = Vector3.Distance(transform.TransformPoint(meshGraph.vertices[i]), transform.TransformPoint(meshGraph.vertices[neighbors[j]]));
                currentNode.neighbors.Add(simpleGraph.graph[neighbors[j]]);
                currentNode.weight.Add(dist);
                Sampler.transform.position = transform.TransformPoint(meshGraph.vertices[i]);
                if (Physics.Raycast(Sampler.transform.position, Vector3.Normalize(meshGraph.vertices[neighbors[j]] - meshGraph.vertices[i]), dist))
                {
                    if (!DeadVertices.Contains(neighbors[j]))
                    {
                        DeadVertices.Add(neighbors[j]); DeadNodes.Add(simpleGraph.graph[neighbors[j]]); break;
                    }
                }
            }
            //Debug.Log(i);
        }

        foreach (pathNode node in DeadNodes)
        {
            simpleGraph.DeleteNode(node.ID);
        }

        //Rebuild mesh
        NavMeshGenerator.RemoveTriangles(meshGraph, DeadVertices);
    }