Example #1
0
    /// <summary>
    /// A smoothed path from start to end.
    /// </summary>
    /// <param name="startPosition">The Start position</param>
    /// <param name="endPosition">The End position</param>
    /// <returns>A list of points, order from start to end</returns>
    public static List <Vector2> GetSmoothedPath(Vector2 startPosition, Vector2 endPosition)
    {
        if (instance == null)
        {
            Debug.LogError("NavMesh2D: Scene does not contain a 2D NavMesh");
            return(new List <Vector2>());
        }

        List <Vector2> resultingPath = new List <Vector2>(0);

        NavMesh2DNode startMesh2DNode = GetNavMeshObject().ClosestNodeTo(startPosition);

        if (startMesh2DNode == null)
        {
            startMesh2DNode = GetNavMeshObject().ActualClosestNodeTo(startPosition, false);                                       // Tadej
        }
        NavMesh2DNode endMesh2DNode = GetNavMeshObject().ClosestNodeTo(endPosition);

        if (endMesh2DNode == null)
        {
            endMesh2DNode = GetNavMeshObject().ActualClosestNodeTo(endPosition, false);               // Tadej
        }
        if (startMesh2DNode != null && endMesh2DNode != null)
        {
            resultingPath = instance.SmoothedVectorPath2D(
                instance.GenerationInformation.ColliderPadding, startPosition, endPosition,
                instance.GetPath(startMesh2DNode, endMesh2DNode)
                );
        }

        return(resultingPath);
    }
Example #2
0
    /// <summary>
    /// A path from start to end.
    /// </summary>
    /// <param name="startPosition">The Start position</param>
    /// <param name="endPosition">The End position</param>
    /// <returns>A list of points, order from start to end</returns>
    public static List <Vector2> GetPath(Vector2 startPosition, Vector2 endPosition)
    {
        if (instance == null)
        {
            Debug.LogError("NavMesh2D: Scene does not contain a 2D NavMesh");
            return(new List <Vector2>());
        }

        List <Vector2> resultingPath = new List <Vector2>();

        resultingPath.Add(startPosition);
        NavMesh2DNode startMesh2DNode = GetNavMeshObject().ClosestNodeTo(startPosition);
        NavMesh2DNode endMesh2DNode   = GetNavMeshObject().ClosestNodeTo(endPosition);

        if (startMesh2DNode != null && endMesh2DNode != null)
        {
            resultingPath.AddRange(instance.GetPath(
                                       startMesh2DNode,
                                       endMesh2DNode).Select(a => (Vector2)a.position));
        }

        resultingPath.Add(endPosition);

        return(resultingPath);
    }
Example #3
0
    /// <summary>
    /// Added by Tadej Gregorcic (Motiviti) for Elroy and the Aliens.
    /// Without checking this, the character would sometimes wander off the navmesh if tapping near to where the char standed at the edge.
    /// </summary>
    /// <param name="startPosition">The Start position</param>
    /// <param name="endPosition">The End position</param>
    /// <returns>boolean</returns>
    public static bool IsThereNodeMovement(Vector2 startPosition, Vector2 endPosition)
    {
        if (instance == null)
        {
            Debug.LogError("NavMesh2D: Scene does not contain a 2D NavMesh");
            return(false);
        }

        NavMesh2DNode startMesh2DNode = GetNavMeshObject().ClosestNodeTo(startPosition);
        NavMesh2DNode endMesh2DNode   = GetNavMeshObject().ClosestNodeTo(endPosition);

        if (startMesh2DNode != null && endMesh2DNode != null)
        {
            if (Vector2.Distance(startMesh2DNode.position, endMesh2DNode.position) > 0.0001f)
            {
                return(true);
            }
        }
        return(false);
    }
Example #4
0
        private NavMesh2DNode[] GenerateNodeNetwork(List<Polygon> triangulatedPolygon, Transform parent)
        {
            List<NavMesh2DNode> allGeneratedNodes = new List<NavMesh2DNode>();

            int totalTriangles = triangulatedPolygon.Sum(a => a.Triangles.Count)*2;
            int processedTriangles = 0;

            foreach (Polygon navmesh in triangulatedPolygon)
            {
                HashSet<uint> processedVertices = new HashSet<uint>();
                Dictionary<uint, NavMesh2DNode> navNodeToVertexCode = new Dictionary<uint, NavMesh2DNode>();

                foreach (DelaunayTriangle t in navmesh.Triangles)
                {
                    foreach (TriangulationPoint p in t.Points)
                    {
                        if (processedVertices.Contains(p.VertexCode))
                            continue;
                        processedVertices.Add(p.VertexCode);

                        NavMesh2DNode newMesh2DNode = new NavMesh2DNode();
                        newMesh2DNode.position = new Vector3((float)p.X, (float)p.Y, 0);
                        navNodeToVertexCode.Add(p.VertexCode, newMesh2DNode);
                    }

                    processedTriangles++;
                    if(EditorUtility.DisplayCancelableProgressBar("Generating NavMesh2D", "Generating node network",
                                                     0.5f + (((float)processedTriangles / (float)totalTriangles) / 2)))
                        throw new System.OperationCanceledException("User canceled.");

                }

                allGeneratedNodes.AddRange(navNodeToVertexCode.Values.ToArray());
                processedVertices.Clear();

                foreach (DelaunayTriangle t in navmesh.Triangles)
                {
                    foreach (TriangulationPoint p in t.Points)
                    {
                        foreach (TriangulationPoint pp in t.Points)
                        {
                            if (pp.VertexCode == p.VertexCode)
                                continue;
                            navNodeToVertexCode[p.VertexCode].ConnectTo(allGeneratedNodes.IndexOf(navNodeToVertexCode[pp.VertexCode]), NavMesh2DConnection.ConnectionType.Standard);
                        }
                        if (processedVertices.Contains(p.VertexCode))
                            continue;

                        processedVertices.Add(p.VertexCode);
                        List<FixedArray3<TriangulationPoint>> connectedTriangles =
                            navmesh.Triangles.Where(a => a != t).Select(a => a.Points).Where(
                                a => a.Any(b => b.VertexCode == p.VertexCode)).ToList();

                        foreach (FixedArray3<TriangulationPoint> point in connectedTriangles)
                        {
                            foreach (TriangulationPoint triangulationPoint in point.Where(a => a.VertexCode != p.VertexCode))
                            {
                                navNodeToVertexCode[p.VertexCode].ConnectTo(allGeneratedNodes.IndexOf(navNodeToVertexCode[triangulationPoint.VertexCode]), NavMesh2DConnection.ConnectionType.Standard);
                            }
                        }

                        processedTriangles++;
                        if (EditorUtility.DisplayCancelableProgressBar("Generating NavMesh2D", "Generating node network",
                                                         0.5f + (((float)processedTriangles / (float)totalTriangles) / 2)))
                            throw new System.OperationCanceledException("User canceled.");
                    }

                }
            }

            return allGeneratedNodes.ToArray();
        }