private IEnumerator SpawnStruct(TerrainElements.TerrainElement terrainElement, int amount, bool lastRound) { GameObject prefab = terrainElement.prefab; int width = terrainElement.width; int height = terrainElement.height; int fromCenter = Mathf.RoundToInt(Chunk.fromCenter); Vector3 spot; int x = Random.Range(-fromCenter, fromCenter - width + 1); //makes sure that whole terrain element gets spawned inside of the chunk int y = Random.Range(-fromCenter + height, fromCenter + 1); //because x and y represent top left 1x1 part of the element for (int i = 0; i < amount; i++) { while (!DoesFit(x, y, width, height)) //checks if terrain element can fit if it's top right corner is at x y { x = Random.Range(-fromCenter, fromCenter - width + 1); y = Random.Range(-fromCenter + height, fromCenter + 1); } spot = new Vector3(x + width / 2f, y - height / 2f, 0); //we align the sprite with the grid GameObject temp; temp = Instantiate(prefab, transform.position + spot, Quaternion.identity); temp.transform.parent = gameObject.transform; temp.transform.position += new Vector3(0, 0, terrainElement.layer); busyArea += width * height; yield return(new WaitForSeconds(0.005f)); } if (lastRound) { isSpawning = false; } }
public IEnumerator GenerateTerrain(int[] seed) { if (IsSeedProper(seed)) { int freeArea = Chunk.ChunkSize * Chunk.ChunkSize * seed[0] / 100; int amount; for (int x = 1; x < elementNames.Count; x++) { isSpawning = true; TerrainElements.TerrainElement toLoad = terrainElements[elementNames[x]]; amount = freeArea * seed[x] / 100 / toLoad.area; if (x == 1) { trees = amount; } if (x == 2) { bushes = amount; } if (x == 3) { grass = amount; } bool lastRound = x == elementNames.Count - 1; StartCoroutine(SpawnStruct(toLoad, amount, lastRound)); yield return(new WaitForSeconds(0.1f)); } } }