/// <summary> /// Runs the loop that spawns all the walls. /// </summary> /// <returns>Waits a frame between spawning</returns> private IEnumerator SpawnRooms() { // Controls how many spawn runs there are for (int i = 0; i < spawnRuns; ++i) { // Forces the function to wait a frame between each spawn run yield return(0); // Find all spawnpoings GameObject[] roomSpawnpoints = GameObject.FindGameObjectsWithTag("RoomSpawnpoint"); //Debug.Log("Iteration " + i + ", " + (roomSpawnpoints.Length) + " spawnpoints"); // Check if a room should be spawned on each spawnpoint foreach (var spawnpoint in roomSpawnpoints) { RoomSpawnSettings spawnSettings = spawnpoint.GetComponent <RoomSpawnSettings>(); Vector3 spawnLocation = spawnpoint.transform.position; //DestroyImmediate(spawnpoint.gameObject); // If the PRNG is not correct, do not spawn on this spawnpoint if (Random.Range(0, spawnThresholdMax) < spawnThreshold) { continue; } // Check which door the room needs and spawn it foreach (EnumList.RoomDoors door in (EnumList.RoomDoors[])Enum.GetValues(typeof(EnumList.RoomDoors))) { if (CheckDoorAttachSide(spawnSettings, door)) { SpawnRoom(door, spawnLocation); break; } } } // Clear the array for next iteration Array.Clear(roomSpawnpoints, 0, roomSpawnpoints.Length); //Debug.Log("End of iteration, " + roomSpawnpoints.Length + " spawnpoints remain"); } // Removes rooms that overlap RemoveOverlappingRooms(); // Spawn walls once all the rooms have been spawned StartCoroutine("SpawnWalls"); }
/// <summary> /// Checks what side needs to be open for the doors to line up /// </summary> /// <param name="settings">The settings of the room to be checked</param> /// <param name="toCheck">The side to check if it is valid</param> /// <returns></returns> private bool CheckDoorAttachSide(RoomSpawnSettings settings, EnumList.RoomDoors toCheck) { return((settings.doorAttachSide & toCheck) != 0); }