IEnumerator FindPath(Vector3 beginPos, Vector3 targetPos) { Node startNode = grid.GetNodeFromWorldPoint(beginPos); Node endNode = grid.GetNodeFromWorldPoint(targetPos); Vector3[] waypoints = new Vector3[0]; bool pathSuccess = false; if (startNode.walkable && endNode.walkable && startNode != endNode) { Heap <Node> openSet = new Heap <Node>(grid.NodesInGrid); HashSet <Node> closedSet = new HashSet <Node>(); openSet.Add(startNode); while (openSet.Count > 0) { Node currentNode = openSet.RemoveFirst(); closedSet.Add(currentNode); if (currentNode == endNode) { pathSuccess = true; break; } foreach (Node neighbour in grid.GetNeighboursOfNode(currentNode)) { if (!neighbour.walkable || closedSet.Contains(neighbour)) { continue; } int costToNeighbour = currentNode.gCost + grid.GetDistanceBetweenNodes(currentNode, neighbour); if (costToNeighbour < neighbour.gCost || !openSet.Contains(neighbour)) { neighbour.gCost = costToNeighbour; neighbour.hCost = grid.GetDistanceBetweenNodes(neighbour, endNode); neighbour.parent = currentNode; if (!openSet.Contains(neighbour)) { openSet.Add(neighbour); } else { openSet.UpdateItem(neighbour); } } } } } yield return(null); if (pathSuccess) { waypoints = RetracePath(startNode, endNode); } requestManager.FinishedProcessingPath(waypoints, pathSuccess); }