/* * Get the position of the camera and then generate terrains around the camera * TODO : Move Generate Trees to TerrainGeneration script * TODO : Make water plane height adjustable */ public void UpdateMap() { var tileSize = tilePrefab.GetComponent <Terrain>().terrainData.size; int tileWidth = (int)tileSize.x; int tileDepth = (int)tileSize.z; var currentCameraPosition = camera.transform.position; var x = Mathf.Floor(currentCameraPosition.x / tileWidth) * tileWidth; var z = Mathf.Floor(currentCameraPosition.z / tileDepth) * tileDepth; int minMax = (int)Mathf.Floor(mapWidthInTiles / 2); for (int zIndex = -minMax; zIndex <= minMax; zIndex++) { for (int xIndex = -minMax; xIndex <= minMax; xIndex++) { var tilePosition = new Vector3(x + xIndex * tileWidth, 0, z + zIndex * tileDepth); int tilePositionIndexX = (int)(tilePosition.x / tileSize.x); int tilePositionIndexZ = (int)(tilePosition.z / tileSize.z); if (tilePosition.x >= 0 && tilePosition.z >= 0 && terrains[tilePositionIndexZ, tilePositionIndexX] == null) { var tile = Instantiate(Resources.Load("TerrainAssets/TerrainChunk") as GameObject, tilePosition, Quaternion.identity); tile.transform.parent = world.transform; var terrainTile = tile.GetComponent <TerrainGeneration>().GenerateTile(); var terrain = terrainTile.terrain; terrains[tilePositionIndexZ, tilePositionIndexX] = terrain; TerrainGeneration.Fix(terrain, terrains[tilePositionIndexZ, tilePositionIndexX - 1], terrains[tilePositionIndexZ - 1, tilePositionIndexX]); // Create water plane, move and scale it at the center of the terrain var waterTilePosition = new Vector3(tilePosition.x + (tileSize.x / 2), 39f, tilePosition.z + (tileSize.z / 2)); var waterTile = Instantiate(Resources.Load("TerrainAssets/WaterBasicDaytime") as GameObject, waterTilePosition, Quaternion.identity); waterTile.transform.localScale = new Vector3(13, 1, 13); waterTile.transform.parent = terrain.transform; objectGeneration.GenerateTrees(terrainTile); objectGeneration.GenerateGrass(terrainTile); objectGeneration.GenerateRocks(terrainTile); creatureGeneration.GenerationCreatures(terrainTile); } // Set currentTile to be where camera new position is currentTile = new Bounds(new Vector3(x + (tileWidth / 2), 0, z + (tileDepth / 2)), new Vector3(tileWidth, 1000, tileDepth)); } } }