private IEnumerator FindPath(Vector3 startPos, Vector3 targetPos) { Stopwatch sw = new Stopwatch(); sw.Start(); Vector3[] waypoints = new Vector3[0]; bool pathSuccess = false; PathNode startNode = pathGrid.NodeFromWorldPoint(startPos); PathNode targetNode = pathGrid.NodeFromWorldPoint(targetPos); if (startNode.Walkable && targetNode.Walkable) { PathHeap <PathNode> openSet = new PathHeap <PathNode>(pathGrid.MaxSize); HashSet <PathNode> closedSet = new HashSet <PathNode>(); openSet.Add(startNode); while (openSet.Count > 0) { PathNode currentNode = openSet.RemoveFirstItem(); closedSet.Add(currentNode); if (currentNode == targetNode) { sw.Stop(); print("Path found: " + sw.ElapsedMilliseconds + " ms"); pathSuccess = true; //RetracePath(startNode, targetNode); //return; break; } foreach (PathNode neighbour in pathGrid.GetNeighbour(currentNode)) { if (neighbour == null) { continue; } if (!neighbour.Walkable || closedSet.Contains(neighbour)) { continue; } int newMovementCostToNeighbour = currentNode.GCost + GetDistance(currentNode, neighbour) + neighbour.Hindrance; if (newMovementCostToNeighbour < neighbour.GCost || openSet.Contains(neighbour) == false) { neighbour.GCost = newMovementCostToNeighbour; neighbour.HCost = GetDistance(neighbour, targetNode); neighbour.Parent = currentNode; if (openSet.Contains(neighbour) == false) { openSet.Add(neighbour); } else { openSet.UpdateItem(neighbour); } } } } // List<PathNode> tempList = openSet; // HashSet<PathNode> tempList2 = closedSet; } yield return(null); if (pathSuccess) { waypoints = RetracePath(startNode, targetNode); } requestManager.FinishProcessingPath(waypoints, pathSuccess); }