void DisplayObject(TerrainObjectData tod, int index, out bool isDeleted) { GUILayout.BeginHorizontal("box"); GUILayout.BeginVertical(); tod.obj = EditorGUILayout.ObjectField("Object", tod.obj, typeof(GameObject), false) as GameObject; tod.spawnRadius = EditorGUILayout.FloatField("Spawn radius", tod.spawnRadius); tod.spawnIterationCount = EditorGUILayout.IntField("Spawn iteration", tod.spawnIterationCount); tod.minSpawnHeight = EditorGUILayout.FloatField("Min height", tod.minSpawnHeight); tod.maxSpawnHeight = EditorGUILayout.FloatField("Max height", tod.maxSpawnHeight); tod.spawnHeightOffset = EditorGUILayout.FloatField("Height offset", tod.spawnHeightOffset); tod.maxSpawnSlopeValue = EditorGUILayout.Slider("Max slope", tod.maxSpawnSlopeValue, 0f, 0.1f); tod.scaleFactor = EditorGUILayout.Slider("Scale factor", tod.scaleFactor, 0f, 0.99f); GUILayout.EndVertical(); if (GUILayout.Button("Delete object", GUILayout.Height(40))) { serializableObject.objects.RemoveAt(index); isDeleted = true; } else { isDeleted = false; } GUILayout.EndHorizontal(); }
public static List <TerrainObjectData> Generate(TileData tile, TerrainSettings settings, GameObject[] variants) { List <TerrainObjectData> mountains = new List <TerrainObjectData>(); for (int i = 0; i < settings.maxMountainsPerTile; i++) { Vector3 randomPosition = new Vector3(Random.Range(0, settings.tileSize), 0, Random.Range(0, settings.tileSize)); if (tile.type.IsWaterTile()) { randomPosition.y = settings.seaMountainLevel; } int randIndex = Random.Range(0, variants.Length); Vector3 randomRotation = new Vector3(0, Random.Range(0, 360), 0); TerrainObjectData newMountain = new TerrainObjectData(randIndex, randomPosition + tile.Position, randomRotation, Vector3.one * Random.Range(settings.sizeVariationLower, settings.sizeVariationUpper)); mountains.Add(newMountain); } return(mountains); }
void SpawnObjects(List <Vector2> points, TerrainObjectData obj, float[,] heightMap) { float cellSize = 1f / LOD; foreach (Vector2 point in points) { PointData pointData = CalculatePointData(heightMap, cellSize, point); bool spawnAllowed = true; spawnAllowed &= pointData.height >= obj.minSpawnHeight && pointData.height <= obj.maxSpawnHeight; spawnAllowed &= Mathf.Abs(pointData.gradient.x) <= obj.maxSpawnSlopeValue && Mathf.Abs(pointData.gradient.y) <= obj.maxSpawnSlopeValue; if (spawnAllowed) { Vector3 position = new Vector3(point.x, mapGenerator.GetHeightAt(pointData.height), point.y); GameObject gameObj = Instantiate(obj.obj, position, Quaternion.Euler(0f, (float)prng.NextDouble(), 0f)); float scaleMultiplier = (float)prng.NextDouble() * (obj.scaleFactor * 2) - obj.scaleFactor; gameObj.transform.localScale += Vector3.one * scaleMultiplier; SetParent(gameObj); } } }
public void ConstructTerrain() { for (int i = 0; i < terrainData.tiles.Count; i++) { TileData tile = terrainData.tiles[i]; GameObject[] variants; switch (tile.type) { case TileType.CoastInnerCorner: variants = tileSet.coastalInnerCorner; break; case TileType.CoastOuterCorner: variants = tileSet.coastalOuterCorner; break; case TileType.CoastStraight: variants = tileSet.coastalStraight; break; case TileType.Forest: case TileType.Plains: variants = tileSet.plainsTiles; break; case TileType.Mountain: variants = tileSet.plainsTiles; break; case TileType.Taiga: case TileType.Tundra: variants = tileSet.snowTiles; break; case TileType.Desert: variants = tileSet.desertTiles; break; case TileType.RainForest: variants = tileSet.rainForestTiles; break; case TileType.OceanFloor: variants = tileSet.oceanFloorTiles; break; case TileType.RiverMouth: variants = tileSet.riverMouth; break; case TileType.RiverStraight: variants = tileSet.riverStraight; break; case TileType.RiverBendRight: variants = tileSet.riverCornerRight; break; case TileType.RiverBendLeft: variants = tileSet.riverCornerLeft; break; case TileType.RiverEnd: variants = tileSet.riverEnd; break; default: variants = tileSet.plainsTiles; break; } GameObject tileGameObject = Instantiate(variants[Random.Range(0, variants.Length)], tile.Position, Quaternion.Euler(tile.Rotation), transform); for (int j = 0; j < tile.mountains.Count; j++) { TerrainObjectData mountain = tile.mountains[j]; Instantiate(mountainSet.mountains[mountain.typeIndex], mountain.Position, Quaternion.Euler(mountain.Rotation), tileGameObject.transform); } for (int j = 0; j < tile.boulders.Count; j++) { TerrainObjectData boulder = tile.boulders[j]; Instantiate(mountainSet.boulders[boulder.typeIndex], boulder.Position, Quaternion.Euler(boulder.Rotation), tileGameObject.transform); } // set to be covered in snow if below freezing if (tile.temperatureValue < settings.freezingTemperature) { MeshRenderer[] meshRends = tileGameObject.GetComponentsInChildren <MeshRenderer>(); for (int j = 0; j < meshRends.Length; j++) { meshRends[j].sharedMaterial = snowMaterial; } } if (tile.moistureValue < settings.sandMoistureLevel && tile.temperatureValue >= .7f) { MeshRenderer[] meshRends = tileGameObject.GetComponentsInChildren <MeshRenderer>(); for (int j = 0; j < meshRends.Length; j++) { meshRends[j].sharedMaterial = sandMaterial; } } } GenerateOcean(); }