/// <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); }
/// <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); }
/// <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); }
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(); }