using System; using UnityEngine; namespace Utils { public class MapGenerator : MonoBehaviour { public DrawMode drawMode; public const int ChunkSize = 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; public void GenerateMap() { float[,] noiseMap = Noise.GenerateNoiseMap(ChunkSize, ChunkSize, seed, noiseScale, octaves, persistance, lacunarity, offset); Color[] colorMap = new Color[ChunkSize * ChunkSize]; for (int y = 0; y < ChunkSize; y++) for (int x = 0; x < ChunkSize; x++) { float currentHeight = noiseMap[x, y]; for (var i = 0; i < regions.Length; i++) { if (currentHeight <= regions[i].height) { colorMap[y * ChunkSize + x] = regions[i].color; break; } } } MapDisplay display = FindObjectOfType(); switch (drawMode) { case DrawMode.NoiseMap: display.DrawTexture(TextureGenerator.TextureFromHeightMap(noiseMap)); break; case DrawMode.ColorMap: display.DrawTexture(TextureGenerator.TextureFromColorMap(colorMap, ChunkSize, ChunkSize)); break; case DrawMode.Mesh: display.DrawMesh(MeshGenerator.GenerateTerrainMesh(noiseMap, meshHeightMultiplier, meshHeightCurve, levelOfDetail), TextureGenerator.TextureFromColorMap(colorMap, ChunkSize, ChunkSize)); break; } } private void OnValidate() { lacunarity = Mathf.Clamp(lacunarity, 1, 100000); octaves = Mathf.Clamp(octaves, 1, 100000); } } [Serializable] public struct TerrainType { public string name; public float height; public Color color; } public enum DrawMode { NoiseMap, ColorMap, Mesh } }