public void SetPuzzleSize(int x, int y, int z)
    {
        // Creates and destroys cubes to fit the puzzle size.
        // clear existing cubes
        foreach (DanMeyerCube dmc in cubes)
        {
            Destroy(dmc.gameObject);
        }
        cubes.Clear();


        for (int i = 0; i < x; i++)
        {
            for (int j = 0; j < y; j++)
            {
                for (int k = 0; k < z; k++)
                {
                    GameObject   newCube = (GameObject)Instantiate(danMeyerCubePrefab, transform.position + (transform.right * i + transform.up * j + transform.forward * k) * cubeScale, transform.rotation);
                    DanMeyerCube dmc     = newCube.GetComponent <DanMeyerCube>();
                    dmc.indexedPosition = new Vector3(i, j, k);
                    cubes.Add(dmc);
                    newCube.transform.parent     = transform;
                    newCube.transform.localScale = Vector3.one * 0.98f * cubeScale;
                }
            }
        }

//		// And purge all cubes that were outside, if we shrank
//		List<Vector3> toRemove = new List<Vector3>();
//		if (x < puzzleSize.x || y < puzzleSize.y || z < puzzleSize.z){
//			foreach(KeyValuePair<Vector3,DanMeyerCube> kvp in cubes){
//				if (kvp.Key.x > x || kvp.Key.y < y || kvp.Key.z < z){
//					Destroy(kvp.Value.gameObject);
//					toRemove.Add(kvp.Key);
//				}
//			}
//		}
//		foreach(Vector3 rem in toRemove){
//			cubes.Remove(rem);
//		}
//		puzzleSize = new Vector3(x,y,z);
        RepositionEditorCameraParent();
        sizeX.text = x.ToString();
        sizeY.text = y.ToString();
        sizeZ.text = z.ToString();
        UpdateCountText();
        solvingP.transform.localPosition = CenterOfCube() / 2f;       // particle system should also be centered
//		Debug.Log("Sizex:"+sizeX.text);
    }
    void Update()
    {
        if (Input.GetMouseButtonUp(0))
        {
            UpdateClickableStateForAllCubes();
        }

        if (Input.GetKeyDown(KeyCode.Escape))
        {
            if (rotating)
            {
                MouseLockCursor.ShowCursor(true, "end edit dan meyer cube while rotating");
            }
            lm.EndEditing();             // will disable this object, preventing further updates from happening after the following return; statement
            return;
        }

        if (Input.GetMouseButtonDown(1))
        {
            mouseLook.enabled = true;
            rotating          = true;    // mouse look
            MouseLockCursor.ShowCursor(false, "eidting dan meyer cube");
        }
        if (Input.GetMouseButtonUp(1))
        {
            mouseLook.enabled = false;
            rotating          = false;
            MouseLockCursor.ShowCursor(true, "eidting dan meyer cube");
        }

        if (rotating)
        {
            return;
        }

//		RaycastHit[] hits;
        List <DanMeyerCube> cubesToAffect = new List <DanMeyerCube>();

        foreach (RaycastHit hit in Physics.RaycastAll(cam.ScreenPointToRay(Input.mousePosition), 300))
        {
            DanMeyerCube dmc = hit.collider.GetComponent <DanMeyerCube>();
//			if (!dmc) {
//				// maybe they clicked the toggle!
//				UIBooleanSlider =
//			}
            if (dmc)
            {
                // we are hovering over a cube while in editing mode.
                // Hotkeys are SHIFT, ALT, CTRL for columns, x rows, z rows
                foreach (DanMeyerCube dm2 in lm.cubes)
                {
                    // columns let's say
                    // get all cubes in this column.
                    if (Input.GetKey(KeyCode.LeftShift) && Input.GetKey(KeyCode.LeftControl) && Input.GetKey(KeyCode.LeftAlt))
                    {
                        //ALL of them.
//						if ((int)dm2.indexedPosition.y == (int)dmc.indexedPosition.y  (int)dm2.indexedPosition.z == (int)dmc.indexedPosition.z){
                        cubesToAffect.Add(dm2);
                        LevelBuilder.inst.MakeHighlightFX2(dm2.transform, "dan meyer cube high");
//						}
                    }
                    else if (Input.GetKey(KeyCode.LeftShift) && Input.GetKey(KeyCode.LeftControl))
                    {
                        // HORIZONTAL PLANE
                        if ((int)dm2.indexedPosition.y == (int)dmc.indexedPosition.y)
                        {
                            cubesToAffect.Add(dm2);
                            LevelBuilder.inst.MakeHighlightFX2(dm2.transform, "dan meyer cube high");
                        }
                    }
                    else if (Input.GetKey(KeyCode.LeftShift) && Input.GetKey(KeyCode.LeftAlt))
                    {
                        // VERTICAL Z PLANE
                        if ((int)dm2.indexedPosition.z == (int)dmc.indexedPosition.z)
                        {
                            cubesToAffect.Add(dm2);
                            LevelBuilder.inst.MakeHighlightFX2(dm2.transform, "dan meyer cube high");
                        }
                    }
                    else if (Input.GetKey(KeyCode.LeftControl) && Input.GetKey(KeyCode.LeftAlt))
                    {
                        // VERTICAL X PLANE
                        if ((int)dm2.indexedPosition.x == (int)dmc.indexedPosition.x)
                        {
                            cubesToAffect.Add(dm2);
                            LevelBuilder.inst.MakeHighlightFX2(dm2.transform, "dan meyer cube high");
                        }
                    }
                    else if (Input.GetKey(KeyCode.LeftShift))
                    {
                        // Z ROW ONLY

                        if ((int)dm2.indexedPosition.y == (int)dmc.indexedPosition.y && (int)dm2.indexedPosition.z == (int)dmc.indexedPosition.z)
                        {
                            cubesToAffect.Add(dm2);
                            LevelBuilder.inst.MakeHighlightFX2(dm2.transform, "dan meyer cube high");
                        }
                    }
                    else if (Input.GetKey(KeyCode.LeftControl))
                    {
                        // X ROW ONLY
                        if ((int)dm2.indexedPosition.x == (int)dmc.indexedPosition.x && (int)dm2.indexedPosition.y == (int)dmc.indexedPosition.y)
                        {
                            cubesToAffect.Add(dm2);
                            LevelBuilder.inst.MakeHighlightFX2(dm2.transform, "dan meyer cube high");
                        }
                    }
                    else if (Input.GetKey(KeyCode.LeftAlt))
                    {
                        // COLUMN ONLY
                        if ((int)dm2.indexedPosition.x == (int)dmc.indexedPosition.x && (int)dm2.indexedPosition.z == (int)dmc.indexedPosition.z)
                        {
                            cubesToAffect.Add(dm2);
                            LevelBuilder.inst.MakeHighlightFX2(dm2.transform, "dan meyer cube high");
                        }
                    }
                }
                if (cubesToAffect.Count == 0)
                {
                    // no hotkeys pressed so we didn't add the "focus" cube under the mouse cursor.
                    cubesToAffect.Add(dmc);
                    LevelBuilder.inst.MakeHighlightFX2(dmc.transform, "dan meyer cube high");
                }
                if (Input.GetMouseButtonDown(0))
                {
//					Debug.Log("<color=#00f>Affecting</color>Affecting:"+cubesToAffect.Count+"cubes.");
                    bool active = !slider.GetSliderValue();                     // cache this value for .000001s savings. By the way slider value == true is DESTROY in this setup.
                    foreach (DanMeyerCube dm3 in cubesToAffect)
                    {
                        if (active)
                        {
                            dm3.TurnCubeOff(active);                                 // note we are comparing ONLY the active value of the exact hovering cube, so all column/row cubes are set to the SAME bool value, not "flipped"
                        }
                        else
                        {
                            dm3.TurnCubeOn(active);
                        }
                    }
                    lm.UpdateCountText();
                }
                break;                 // the foreach doesn't continue after this.
            }
        }
    }