using UnityEngine; using System.Collections; public class MapGenerator : MonoBehaviour { public MapDisplay display; public enum DrawMode {NoiseMap, ColourMap, Mesh}; public DrawMode drawMode; const int mapChunkSize = 241; [Range(0,6)] public int levelOfDetail; public float noiseScale; public int octaves; [Range(0,1)] public float persistance; public float lacunarity; public int seed; public Vector2 offset; public float meshHeightMultiplier; public AnimationCurve meshHeightCurve; public bool autoUpdate; public TerrainType[] regions; void Start() { noiseScale = Random.Range(15, 30); octaves = Random.Range(1, 10); persistance = Random.Range(0.2f, 0.6f); lacunarity = Random.Range(1, 3); seed = Random.Range(-1000, 1000); GenerateMap(); } public void GenerateMap() { float[,] noiseMap = Noise.GenerateNoiseMap (mapChunkSize, mapChunkSize, seed, noiseScale, octaves, persistance, lacunarity, offset); Color[] colourMap = new Color[mapChunkSize * mapChunkSize]; for (int y = 0; y < mapChunkSize; y++) { for (int x = 0; x < mapChunkSize; x++) { float currentHeight = noiseMap [x, y]; for (int i = 0; i < regions.Length; i++) { if (currentHeight <= regions [i].height) { colourMap [y * mapChunkSize + x] = regions [i].colour; break; } } } } var texture = TextureGenerator.TextureFromColourMap(colourMap, mapChunkSize, mapChunkSize); var meshData = MeshGenerator.GenerateTerrainMesh(noiseMap, meshHeightMultiplier, meshHeightCurve, levelOfDetail); display.DrawMesh(meshData, texture); } void OnValidate() { if (lacunarity < 1) { lacunarity = 1; } if (octaves < 0) { octaves = 0; } if (autoUpdate) { GenerateMap(); } } } [System.Serializable] public struct TerrainType { public string name; public float height; public Color colour; }