- Home /
A While Loop in a path finding system is freezing, how can I fix this?
I am developing a custom path finding system for a four-way grid. At this point, I have nodes that have neighbors, a starting point and a end point target. I am attempting to work out the path between the start and end - four way only, NOT diagonal, and then run the path, but the loop is freezing - with barely anything in it. In order to prevent a total game crash I inserted a time check, but it doesn't stop the game itself from pausing until the system breaks the loop. The code for the current path finder is below:
void PathFinder()
{
// Find Target Point //
GetBoardPosition();
int TargetX = TargetSquare.X;
int TargetY = TargetSquare.Y;
int CurrentX = lastSquare.X;
int CurrentY = lastSquare.Y;
bool IsTrue = true;
// Get Current Board state //
Squares[,] GameBoard = new Squares[BoardSize, BoardSize];
for (int widthTraveled = 0; widthTraveled < BoardSize; widthTraveled++)
{
for (int heightTraveled = 0; heightTraveled < BoardSize; heightTraveled++)
{
Squares PointEval = System_GameController.Instance.GameArray[widthTraveled, heightTraveled].GetComponent<Squares>();
if (PointEval._cellState == cellStates.isEmpty)
{
PointEval.Cost = 1;
}
if (PointEval._cellState == cellStates.isOccupied)
{
PointEval.Cost = 100;
}
if (PointEval._cellState == cellStates.isX)
{
PointEval.Cost = 50;
}
if (PointEval._cellState == cellStates.isO)
{
PointEval.Cost = 50;
}
}
}
lastSquare.Cost = 0;
TargetSquare.Cost = 500;
// Check if neighbors that are closer to the target have a cost of 1 //
bool FoundMoveTarget = false;
List<Squares> ClosedSquares = new List<Squares>();
List<Squares> OpenSquares = new List<Squares>();
System.DateTime CurrentTime = System.DateTime.Now;
OpenSquares.Add(lastSquare);
while (OpenSquares.Count > 0)
{
if ((System.DateTime.Now - CurrentTime).TotalMilliseconds > maxSeekTime)
{
Debug.Log("Seek Time Exceeded.");
break;
}
}
}
OpenSquares.Count > 0 cant occur when you are stuck in your loop. It's that simple.
Why not run a for loop with your timed parameters ins$$anonymous$$d? Or run a loop in a coroutine and provide a yield so the function can run over multiple frames.
That code can't work :) the loop iterates round and round until OpenSquares.Count==0, but nothing ever changes the OpenSquares list to empty, so it'll never finish. It sounds like there's a bit more to this one - is there some code that used to go in there, but wasn't working?
Your answer
![](https://koobas.hobune.stream/wayback/20220613161603im_/https://answers.unity.com/themes/thub/images/avi.jpg)
Follow this Question
Related Questions
Multiple Cars not working 1 Answer
Distribute terrain in zones 3 Answers
Evade a Collider on Vector3.forward 3 Answers
A* Pathfinding Project Problem with Obstacles 2 Answers
A* Algorithm Node Grid Generation 2 Answers