private void FindPath(Vector3 startPosition, Vector3 targetPosition) { Stopwatch sw = new Stopwatch(); sw.Start(); Node startNode = aGrid.NodeFromWorldPoint(startPosition); Node targetNode = aGrid.NodeFromWorldPoint(targetPosition); List <Node> openSet = new List <Node>(); HashSet <Node> closedSet = new HashSet <Node>(); openSet.Add(startNode); while (openSet.Count > 0) { Node currentNode = openSet[0]; for (int i = 1; i < openSet.Count; i++) { if (openSet[i].fCost < currentNode.fCost || openSet[i].fCost == currentNode.fCost && openSet[i].hCost < currentNode.hCost) { currentNode = openSet[i]; } } openSet.Remove(currentNode); closedSet.Add(currentNode); // The target has been found, so exit out of the loop if (currentNode == targetNode) { sw.Stop(); print("Path found: " + sw.ElapsedMilliseconds + " ms"); RetracePath(startNode, targetNode); return; } foreach (Node neighbor in aGrid.GetNeighbors(currentNode)) { if (!neighbor.walkable || closedSet.Contains(neighbor)) { continue; } int newMovementCostToNeighbor = currentNode.gCost + GetDistance(currentNode, neighbor); if (newMovementCostToNeighbor < neighbor.gCost || !openSet.Contains(neighbor)) { neighbor.gCost = newMovementCostToNeighbor; neighbor.hCost = GetDistance(neighbor, targetNode); neighbor.parent = currentNode; if (!openSet.Contains(neighbor)) { openSet.Add(neighbor); } } } } }
// Get the shortest* path from a start position to a target position. IEnumerator FindPath(Vector3 startPos, Vector3 targetPos, float unitIntel) { //Stopwatch sw = new Stopwatch(); //sw.Start(); print("PLAYER MOVEMENT PATH: Calculating the correct path now."); Vector3[] waypoints = new Vector3[0]; bool pathSuccess = false; // Get the node on which the start and target world positions are. Node startNode = aGrid.NodeFromWorldPoint(startPos); Node targetNode = aGrid.NodeFromWorldPoint(targetPos); //print("MOVEMENT PATH: Is my start node walkable? " + startNode.walkable); print("PLAYER MOVEMENT PATH: targetNode world position: " + targetNode.worldPos); print("PLAYER MOVEMENT PATH: targetNode X/Y grid position: " + targetNode.gridX + "/" + targetNode.gridY); print("PLAYER MOVEMENT PATH: Is my target node walkable? " + targetNode.walkable); if (/* startNode.walkable && */ targetNode.walkable) { Heap <Node> openSet = new Heap <Node>(aGrid.MaxSize); HashSet <Node> closedSet = new HashSet <Node>(); openSet.Add(startNode); while (openSet.Count > 0) { Node currentNode = openSet.RemoveFirst(); closedSet.Add(currentNode); if (currentNode == targetNode) { //sw.Stop(); //print ("Path Found: " + sw.ElapsedMilliseconds + "ms"); pathSuccess = true; break; } foreach (Node neighbour in aGrid.GetNeighbours(currentNode)) { if (!neighbour.walkable || closedSet.Contains(neighbour)) { continue; } int newMovementCostToNeighbour = currentNode.gCost + GetDistance(currentNode, neighbour) + Mathf.RoundToInt(neighbour.movementPenalty * unitIntel); //print(Mathf.RoundToInt(neighbour.movementPenalty * unitIntel)); if (newMovementCostToNeighbour < neighbour.gCost || !openSet.Contains(neighbour)) { neighbour.gCost = newMovementCostToNeighbour; neighbour.hCost = GetDistance(neighbour, targetNode); neighbour.parent = currentNode; if (!openSet.Contains(neighbour)) { openSet.Add(neighbour); } else { openSet.UpdateItem(neighbour); } } } } } yield return(null); if (pathSuccess) { waypoints = RetracePath(startNode, targetNode); } requestManager.FinishedProcessingPath(waypoints, pathSuccess); //print("FindPath; pathSuccess: "+pathSuccess); }
IEnumerator FindPath(Vector3 startPosition, Vector3 targetPosition) { Stopwatch sw = new Stopwatch(); sw.Start(); Vector3[] waypoints = new Vector3[0]; bool pathSuccess = false; Node startNode = aGrid.NodeFromWorldPoint(startPosition); Node targetNode = aGrid.NodeFromWorldPoint(targetPosition); if (startNode.walkable && targetNode.walkable) { Heap <Node> openSet = new Heap <Node>(aGrid.MaxSize); HashSet <Node> closedSet = new HashSet <Node>(); openSet.Add(startNode); while (openSet.Count > 0) { Node currentNode = openSet.RemoveFirst(); closedSet.Add(currentNode); // The target has been found, so exit out of the loop if (currentNode == targetNode) { sw.Stop(); //print("Path found: " + sw.ElapsedMilliseconds + " ms"); pathSuccess = true; break; } foreach (Node neighbor in aGrid.GetNeighbors(currentNode)) { if (!neighbor.walkable || closedSet.Contains(neighbor)) { continue; } int newMovementCostToNeighbor = currentNode.gCost + GetDistance(currentNode, neighbor) + neighbor.movementPenalty; if (newMovementCostToNeighbor < neighbor.gCost || !openSet.Contains(neighbor)) { neighbor.gCost = newMovementCostToNeighbor; neighbor.hCost = GetDistance(neighbor, targetNode); neighbor.parent = currentNode; if (!openSet.Contains(neighbor)) { openSet.Add(neighbor); } else { openSet.UpdateItem(neighbor); } } } } } yield return(null); if (pathSuccess) { waypoints = RetracePath(startNode, targetNode); } requestManager.FinishedProcessingPath(waypoints, pathSuccess); pathID++; // FOR DEBUGGING ONLY }