Unity Editor Freezing on Run

Hi,
I have the following script, which will generate a random map when the bool “GenerateMap” is true. However, when I set the bool to true, the unity editor freezes, and has to be closed by opening the task manager.

using UnityEngine;
using System.Collections;
using UnityEngine.SceneManagement;


public class GameManager : MonoBehaviour {

	public bool GenerateRandom;



	public GameObject canvas;


	public GameObject[] piecePrefabs;


	[System.Serializable]
	public class Puzzle
	{

		public int winValue;
		public int curValue;

		public int width;
		public int height;
		public piece[,] pieces;

	}


	public Puzzle puzzle;


	// Use this for initialization
	void Start () {

		canvas.SetActive (false);

		if (GenerateRandom) {

			if (puzzle.width == 0 || puzzle.height == 0) {

				Debug.LogError ("Please set the dimensions");


			}

			GeneratePuzzle ();








		} else {

			Vector2 dimensions = CheckDimensions ();

			puzzle.width = (int)dimensions.x;
			puzzle.height = (int)dimensions.y;


			puzzle.pieces = new piece[puzzle.width, puzzle.height];



			foreach (var piece in GameObject.FindGameObjectsWithTag("Piece")) {

				puzzle.pieces [(int)piece.transform.position.x, (int)piece.transform.position.y] = piece.GetComponent<piece> ();

			}
		}


		foreach (var item in puzzle.pieces) {

			Debug.Log(item.gameObject.name);
		}


		puzzle.winValue = GetWinValue ();

		Shuffle ();

		puzzle.curValue=Sweep ();


	}


	void GeneratePuzzle()
	{
		puzzle.pieces = new piece[puzzle.width, puzzle.height];

		int[] auxValues = { 0, 0, 0, 0 };


		for (int h = 0; h < puzzle.height; h++) {
			for (int w = 0; w < puzzle.width; w++) {



				//width restrictions
				if (w == 0)
					auxValues [3] = 0;
				else
					auxValues [3] = puzzle.pieces [w - 1, h].values [1];

				if (w == puzzle.width - 1)
					auxValues [1] = 0;
				else
					auxValues [1] = Random.Range (0, 2);


				//heigth resctrictions

				if (h == 0)
					auxValues [2] = 0;
				else
					auxValues [2] = puzzle.pieces [w, h - 1].values [0];

				if (h == puzzle.height - 1)
					auxValues [0] = 0;
				else
					auxValues [0] = Random.Range (0, 2);


				//tells us piece type
				int valueSum = auxValues [0] + auxValues [1] + auxValues [2] + auxValues [3];


				if (valueSum == 2 && auxValues [0] != auxValues [2])
					valueSum = 5;


				GameObject go =  (GameObject) Instantiate (piecePrefabs [valueSum], new Vector3 (w, h, 0), Quaternion.identity);



				while (go.GetComponent<piece> ().values [0] != auxValues [0] ||
					go.GetComponent<piece> ().values [1] != auxValues [1] ||
					go.GetComponent<piece> ().values [2] != auxValues [2] ||
					go.GetComponent<piece> ().values [3] != auxValues [3]) 

				{
					go.GetComponent<piece> ().RotatePiece ();

				}

				puzzle.pieces [w, h] = go.GetComponent<piece> ();



			}
		}



	}


	public int Sweep()
	{
		int value = 0;

		for (int h = 0; h < puzzle.height; h++) {
			for (int w = 0; w < puzzle.width; w++) {


				//compares top
				if(h!=puzzle.height-1)
				if (puzzle.pieces [w, h].values [0] == 1 && puzzle.pieces [w, h + 1].values [2] == 1)
					value++;


				//compare right
				if(w!=puzzle.width-1)
				if (puzzle.pieces [w, h].values [1] == 1 && puzzle.pieces [w + 1, h].values [3] == 1)
					value++;


			}
		}

		return value;

	}


	public void Win()
	{

		canvas.SetActive (true);
	}

	public int QuickSweep(int w,int h)
	{
		int value = 0;

		//compares top
		if(h!=puzzle.height-1)
		if (puzzle.pieces [w, h].values [0] == 1 && puzzle.pieces [w, h + 1].values [2] == 1)
			value++;


		//compare right
		if(w!=puzzle.width-1)
		if (puzzle.pieces [w, h].values [1] == 1 && puzzle.pieces [w + 1, h].values [3] == 1)
			value++;


		//compare left
		if (w != 0)
		if (puzzle.pieces [w, h].values [3] == 1 && puzzle.pieces [w - 1, h].values [1] == 1)
			value++;

		//compare bottom
		if (h != 0)
		if (puzzle.pieces [w, h].values [2] == 1 && puzzle.pieces [w, h-1].values [0] == 1)
			value++;


		return value;

	}

	int GetWinValue()
	{

		int winValue = 0;
		foreach (var piece in puzzle.pieces) {


			foreach (var j in piece.values) {
				winValue += j;
			}


		}

		winValue /= 2;

		return winValue;



	}

	void Shuffle()
	{
		foreach (var piece in puzzle.pieces) {

			int k = Random.Range (0, 4);

			for (int i = 0; i < k; i++) {
				piece.RotatePiece ();
			}


		}
	}


	Vector2 CheckDimensions()
	{
		Vector2 aux = Vector2.zero;

		GameObject[] pieces = GameObject.FindGameObjectsWithTag ("Piece");

		foreach (var p in pieces) {
			if (p.transform.position.x > aux.x)
				aux.x = p.transform.position.x;

			if (p.transform.position.y > aux.y)
				aux.y= p.transform.position.y;
		}

		aux.x++;
		aux.y++;

		return aux;
	}

	// Update is called once per frame
	void Update () {

	}




	public void NextLevel(string nextLevel)
	{

		SceneManager.LoadScene (nextLevel);

	}
}

Any suggestions?

We don’t know what your RotatePiece() method does, but I’d say you’ve got an infinite loop here:

while (go.GetComponent<piece> ().values [0] != auxValues [0] ||
  go.GetComponent<piece> ().values [1] != auxValues [1] ||
  go.GetComponent<piece> ().values [2] != auxValues [2] ||
  go.GetComponent<piece> ().values [3] != auxValues [3]) 
{
  go.GetComponent<piece> ().RotatePiece ();
}