public void Update() { if (timer < 0) { Node newClosest = manager.ClosestNodeToPoint(transform.position); if (newClosest != closestNode) { eventToRaise.Raise(); closestNode = newClosest; } timer = tickRate; } else { timer -= Time.deltaTime; } }
List <Node> AStar() { InitializeAStarDictionary(); AStarNode startNode = nodeToAStarNode[manager.ClosestNodeToPoint(transform.position)]; AStarNode endNode = nodeToAStarNode[manager.ClosestNodeToPoint(target)]; //Set targets for everybody foreach (Node node in manager.nodeList) { nodeToAStarNode[node].SetTarget(endNode); } AStarNode currentNode = startNode; Heap <AStarNode> open = new Heap <AStarNode>(manager.nodeList.Count); open.Add(currentNode); bool pathSolved = false; int safeCounter = 0; while (open.Count > 0) { safeCounter++; if (safeCounter > 9999) { UnityEngine.Debug.LogWarning("Timed out!"); break; } //Find the lowest f in open, then set it to current node currentNode = open.RemoveFirst(); //If current node is end... if (currentNode == endNode) { pathSolved = true; break; } //Loop through neighbors foreach (Node nodeNeighbor in currentNode.node.GetNeighbors()) { AStarNode neighbor = nodeToAStarNode[nodeNeighbor]; //If neighbor is already explored... continue if (neighbor.IsExplored()) { continue; } //Old G cost float oldG = neighbor.G; //If neighbor is already in open... if (open.Contains(neighbor)) { //And new g cost is less than old g cost... float newG = Node.Distance(neighbor.node, currentNode.node); if (newG < oldG) { //Make this the new parent neighbor.SetParent(currentNode); //This sets parent and sets g value open.UpdateItem(neighbor); } } else //otherwise //Set this to parent and add neighbor to open { neighbor.SetParent(currentNode); open.Add(neighbor); } } //Explores current node currentNode.CloseNode(); } if (pathSolved) { List <Node> path = new List <Node>(); AStarNode n = currentNode; while (n != startNode) { path.Add(n.node); n = n.GetParent(); } path.Reverse(); return(path); } return(null); }
private void Start() { manager = PathfindingNodeManager.INSTANCE; closestNode = manager.ClosestNodeToPoint(transform.position); }