protected override void CalculateStep (long targetTick) {
int counter = 0;
// Continue to search as long as we haven't encountered an error and we haven't found the target
while (CompleteState == PathCompleteState.NotCalculated) {
// @Performance Just for debug info
searchedNodes++;
// The node might be the target node for one of the paths
if (currentR.flag1) {
// Close the current node, if the current node is the target node then the path is finnished
for (int i = 0; i < targetNodes.Length; i++) {
if (!targetsFound[i] && currentR.node == targetNodes[i]) {
FoundTarget(currentR, i);
if (CompleteState != PathCompleteState.NotCalculated) {
break;
}
}
}
if (targetNodeCount <= 0) {
CompleteState = PathCompleteState.Complete;
break;
}
}
// Loop through all walkable neighbours of the node and add them to the open list.
currentR.node.Open(this, currentR, pathHandler);
// Any nodes left to search?
if (pathHandler.heap.isEmpty) {
CompleteState = PathCompleteState.Complete;
break;
}
// Select the node with the lowest F score and remove it from the open list
AstarProfiler.StartFastProfile(7);
currentR = pathHandler.heap.Remove();
AstarProfiler.EndFastProfile(7);
// Check for time every 500 nodes, roughly every 0.5 ms usually
if (counter > 500) {
// Have we exceded the maxFrameTime, if so we should wait one frame before continuing the search since we don't want the game to lag
if (System.DateTime.UtcNow.Ticks >= targetTick) {
// Return instead of yield'ing, a separate function handles the yield (CalculatePaths)
return;
}
counter = 0;
}
counter++;
}
}