IEnumerator FindNewPath() { findingNewPath = true; List <GameObject> sidePath = new List <GameObject>(); GameObject CurrentGrid; RaycastHit hit; if (Physics.Raycast(transform.position, Vector3.down, out hit, 2)) { if (hit.collider.gameObject.tag == "GridSquare") { CurrentGrid = hit.collider.gameObject; Pathfinder.PopulateValidNodeList(); Pathfinder.openList.Clear(); Pathfinder.closedList.Clear(); Pathfinder.proposedPath.Clear(); Pathfinder.CalculateParent(CurrentGrid); GameObject nextNode = Pathfinder.CalculateNextNode(); for (int i = 0; i < Pathfinder.validNodeList.Count; i++) { if (!Pathfinder.openList.Contains(Pathfinder.end)) { Pathfinder.CalculateParent(nextNode); nextNode = Pathfinder.CalculateNextNode(); } else { i = Pathfinder.validNodeList.Count + 1; } } GameObject backtrack = Pathfinder.end; Pathfinder.proposedPath.Add(backtrack); List <GameObject> traversed = new List <GameObject>(); while (backtrack.GetComponent <GridSquare>().parent != null) { if (!traversed.Contains(backtrack.GetComponent <GridSquare>().parent)) { backtrack = backtrack.GetComponent <GridSquare>().parent; Pathfinder.proposedPath.Add(backtrack); } else { break; } traversed.Add(backtrack); } yield return(new WaitForSeconds(1)); for (int i = Pathfinder.proposedPath.Count - 1; i >= 0; i--) { sidePath.Add(Pathfinder.proposedPath[i]); } enemyPath = sidePath; pathIndex = 0; } else { transform.position = enemyPath[pathIndex].transform.position; } } findingNewPath = false; yield return(null); }