public void CalculateCost(Node_script parent, Node_script goal, int gCost) { this.Parent = parent; this.G = (parent.G + gCost); this.H = (Mathf.Abs((this.Position.Column - goal.Position.Column) + (this.Position.Row - goal.Position.Row)) * 10); this.F = (this.G + this.H); }
private void VisualizeParent(Node_script node, Vector2 worldPosition) { if (node.Parent != null) { GameObject arrow = Instantiate(this._arrowPrefab, worldPosition, Quaternion.identity); arrow.transform.SetParent(this.transform); // RIGHT if ((node.Position.Column < node.Parent.Position.Column) && (node.Position.Row == node.Parent.Position.Row)) { arrow.transform.eulerAngles = new Vector3(0, 0, 0); // RIGHT-DOWN } else if ((node.Position.Column < node.Parent.Position.Column) && (node.Position.Row < node.Parent.Position.Row)) { arrow.transform.eulerAngles = new Vector3(0, 0, -45); // RIGHT-UP } else if ((node.Position.Column < node.Parent.Position.Column) && (node.Position.Row > node.Parent.Position.Row)) { arrow.transform.eulerAngles = new Vector3(0, 0, 45); // LEFT } else if ((node.Position.Column > node.Parent.Position.Column) && (node.Position.Row == node.Parent.Position.Row)) { arrow.transform.eulerAngles = new Vector3(0, 0, 180); // LEFT-DOWN } else if ((node.Position.Column > node.Parent.Position.Column) && (node.Position.Row < node.Parent.Position.Row)) { arrow.transform.eulerAngles = new Vector3(0, 0, -135); // LEFT-UP } else if ((node.Position.Column > node.Parent.Position.Column) && (node.Position.Row > node.Parent.Position.Row)) { arrow.transform.eulerAngles = new Vector3(0, 0, 135); // DOWN } else if ((node.Position.Column == node.Parent.Position.Column) && (node.Position.Row < node.Parent.Position.Row)) { arrow.transform.eulerAngles = new Vector3(0, 0, -90); // UP } else if ((node.Position.Column == node.Parent.Position.Column) && (node.Position.Row > node.Parent.Position.Row)) { arrow.transform.eulerAngles = new Vector3(0, 0, 90); } _arrows.Add(arrow); } }
private static bool IsMoveAllowed(Node_script currentNode, Node_script neighbor) { GridPosition_script direction = (neighbor.Position - currentNode.Position); GridPosition_script first = new GridPosition_script(currentNode.Position.Row, (currentNode.Position.Column + direction.Column)); GridPosition_script second = new GridPosition_script((currentNode.Position.Row + direction.Row), currentNode.Position.Column); if (TileMap_script.Instance.IsWithinBounds(first) && !TileMap_script.Instance.Tiles[first].IsWalkable) { return(false); } if (TileMap_script.Instance.IsWithinBounds(second) && !TileMap_script.Instance.Tiles[second].IsWalkable) { return(false); } return(true); }
public static Stack <Node_script> GetPath(GridPosition_script startPosition, GridPosition_script goalPosition) { if (_nodes == null) { CreateNodes(); } int gCost; Node_script neighbor; GridPosition_script neighborPosition; Node_script currentNode = _nodes[startPosition]; Node_script goalNode = _nodes[goalPosition]; HashSet <Node_script> openList = new HashSet <Node_script>(); HashSet <Node_script> closedList = new HashSet <Node_script>(); Stack <Node_script> path = new Stack <Node_script>(); openList.Add(currentNode); while (openList.Count > 0) { // GET THE NODE WITH THE LOWEST F COST currentNode = openList.OrderBy(n => n.F).First(); // GOAL REACHED if (currentNode == goalNode) { // RECONSTRUCT PATH BY BACKTRACING PARENTS path.Push(currentNode); while (currentNode.Parent != null) { currentNode = currentNode.Parent; path.Push(currentNode); } break; } // COSE CURRENT openList.Remove(currentNode); closedList.Add(currentNode); // OPEN NEIGHBORS for (int row = -1; row <= 1; row++) { for (int column = -1; column <= 1; column++) { neighborPosition = new GridPosition_script(currentNode.Position.Row - row, currentNode.Position.Column - column); // SKIP OUT-OF-BOUNDS, UNWALKABLES AND CURRENT NODE if (TileMap_script.Instance.IsWithinBounds(neighborPosition) && (TileMap_script.Instance.Tiles[neighborPosition].IsWalkable) && (neighborPosition != currentNode.Position)) { neighbor = _nodes[neighborPosition]; // SKIP CLOSED NODE if (closedList.Contains(neighbor)) { continue; } // HORIZONTAL/VERTICAL if (Mathf.Abs(column - row) == 1) { gCost = 10; // DIAGONAL } else { if (!IsMoveAllowed(currentNode, neighbor)) { continue; } gCost = 14; } // NEW/UNVISITED if (!openList.Contains(neighbor)) { openList.Add(neighbor); // SKIP IF NOT BETTER } else if ((currentNode.G + gCost) >= neighbor.G) { continue; } // UPDATE COST neighbor.CalculateCost(currentNode, goalNode, gCost); } } } } _nodes.Clear(); _nodes = null; //// VIZUALIZE OPEN LIST //GameObject.Find("AstarTest_object").GetComponent<AstarTest_script>().Visualize(openList, Color.yellow); //GameObject.Find("AstarTest_object").GetComponent<AstarTest_script>().Visualize(closedList, Color.cyan); //GameObject.Find("AstarTest_object").GetComponent<AstarTest_script>().Visualize(path, Color.blue); return(path); }
public void Visualize(Node_script node, Color color) { node.TileScript.SpriteRenderer.color = color; }