public GameObject GenerateWall(bool generateDoor, float length) { var wallObj = new GameObject(); SceneManager.MoveGameObjectToScene(wallObj, gameObject.scene); Wall mainWall; if (generateDoor) { mainWall = (WallsWithDoor.RandomTake(1).FirstOrDefault() as GameObject).GetComponent <Wall>(); } else { mainWall = (Walls.RandomTake(1).FirstOrDefault() as GameObject).GetComponent <Wall>(); } if (!mainWall) { throw new System.Exception("No enough walls."); } mainWall = Utility.Instantiate(mainWall.gameObject, wallObj).GetComponent <Wall>(); // Put the main wall to an appropriate position if (mainWall.Length > length) { mainWall.transform.position = Vector3.zero; } else { var range = length - mainWall.Length; var pos = UnityEngine.Random.Range(-range / 2, range / 2); mainWall.transform.position = new Vector3(0, 0, pos); // Fill the rest space // Left space var restSpace = length / 2 - mainWall.Length / 2 + pos; Wall wall; AgainLeft: wall = Utility.Instantiate(Walls.RandomTake(1).FirstOrDefault() as GameObject, wallObj).GetComponent <Wall>(); wall.transform.localPosition = new Vector3(0, 0, -length / 2 + restSpace - (wall.Length / 2)); restSpace -= wall.Length; if (restSpace > 0) { goto AgainLeft; } restSpace = length / 2 - mainWall.Length / 2 - pos; AgainRight: wall = Utility.Instantiate(Walls.RandomTake(1).FirstOrDefault() as GameObject, wallObj).GetComponent <Wall>(); wall.transform.localPosition = new Vector3(0, 0, length / 2 - restSpace + (wall.Length / 2)); restSpace -= wall.Length; if (restSpace > 0) { goto AgainRight; } } return(wallObj); }