void ReloadMaze() { if (mazeInstance != null) { Destroy(mazeInstance); squares.Clear(); } mazeInstance = new GameObject("Instance"); mazeInstance.transform.parent = transform; mazeInstance.transform.localPosition = Vector3.zero; squares = SprawlGeneratorLogic.Generate(outlets, isFlat, size, spread, turnFrequency, deadEndFrequency); for (int i = 0; i < squares.Count - 2; i++) { SprawlerSquare square = squares[i]; square.layout = SprawlGeneratorLogic.BuildSquare(square, prefabs, sq); square.layout.transform.parent = mazeInstance.transform; square.layout.transform.localPosition = SprawlGeneratorLogic.SquarePosition(square, sq.GetComponent <PrefabDimensions>()); square.layout.name = "Sq" + square.coordinates.ToString(); } for (int i = squares.Count - 2; i < squares.Count; i++) { squares[i].layout = Instantiate(i == squares.Count - 2 ? entrance : exit, mazeInstance.transform); squares[i].layout.transform.localPosition = SprawlGeneratorLogic.SquarePosition(squares[i], sq.GetComponent <PrefabDimensions>()); } }
static List <SprawlerSquare> AddOutlets(SprawlerSquare[] outlets, List <SprawlerSquare> squares) { List <Vector3> OutletCoordinates = new List <Vector3>(); foreach (SprawlerSquare square in squares) { for (int i = 0; i < directions2D.Length; i++) { if (square.adjacents[i] == null) { OutletCoordinates.Add(square.coordinates + directions2D[i]); } } } for (int i = 0; i < outlets.Length; i++) { outlets[i] = new SprawlerSquare(OutletCoordinates[Random.Range(0, OutletCoordinates.Count)]); OutletCoordinates.Remove(outlets[i].coordinates); squares.Add(outlets[i]); } return(squares); }
public static Vector3 SquarePosition(SprawlerSquare square, PrefabDimensions dimensions) { Vector3 position = new Vector3( square.coordinates.x * dimensions.width, square.coordinates.y * dimensions.height, square.coordinates.z * dimensions.length ); return(position); }
public static GameObject BuildSquare(SprawlerSquare square, LevelPrefabs prefabs, GameObject sqPrefab) { GameObject output = Object.Instantiate(sqPrefab); GameObject currentPrefab; for (int i = 0; i < square.adjacents.Length; i++) { currentPrefab = i < 4 ? prefabs.wall : i == 4 ? prefabs.ceiling : prefabs.floor; if (square.adjacents[i] == null) { Object.Instantiate(currentPrefab, output.transform.GetChild(i)); } } return(output); }
public static List <SprawlerSquare> Generate(SprawlerSquare[] outlets, bool isFlat, int numSquares, Vector3 spread, float turnFrequency, float deadEndFrequency) { List <SprawlerSquare> squares = new List <SprawlerSquare>(); List <Vector3> allCoordinates = new List <Vector3>(); Vector3 newCoordinates; SprawlerSquare newSquare; Vector3[] directions = isFlat ? directions2D : directions3D; int capacity = Capacity(spread, isFlat); if (capacity <= numSquares) { squares = FillSpread(spread, squares); for (int i = 0; i < squares.Count; i++) { allCoordinates.Add(squares[i].coordinates); } } else { //Origin square newCoordinates = Vector3.zero; newSquare = new SprawlerSquare(newCoordinates); squares.Add(newSquare); allCoordinates.Add(newCoordinates); Vector3 direction = Direct(directions); float turn = 1; float deadEnd = 1; for (int i = 1; i < numSquares; i++) { turn = Random.Range(0, 1f); deadEnd = Random.Range(0, 1f); //Direction change if (turn < turnFrequency) { direction = Direct(directions); } //Dead end if (deadEnd < deadEndFrequency) { newCoordinates = allCoordinates[Random.Range(0, allCoordinates.Count)]; direction = Direct(directions); } newCoordinates += direction; //If hit another block or boundary if (allCoordinates.Contains(newCoordinates) || HitBoundary(newCoordinates, spread)) { Vector3 backtrack = newCoordinates - direction; Vector3 dir = Redirect(backtrack, allCoordinates, directions, spread); //Anywhere to go? if (dir == Vector3.zero) { newCoordinates = allCoordinates[Random.Range(0, allCoordinates.Count)]; direction = Direct(directions); } else { direction = dir; newCoordinates = backtrack + dir; } } newSquare = new SprawlerSquare(newCoordinates); squares.Add(newSquare); allCoordinates.Add(newCoordinates); } } //Store adjacent squares StoreAdjacents(squares, allCoordinates); //Add outlets squares = AddOutlets(outlets, squares); return(squares); }