public TerrainChunck(Vector2 coord, HeightMap_Settings heightMapSettings, MeshSettings meshSettings, LODInfo[] detailLeveles, int colliderLODIndex, Transform parent, Transform viewer, Material material) { this.coord = coord; this.detailLeveles = detailLeveles; this.colliderLODIndex = colliderLODIndex; this.heightMapSettings = heightMapSettings; this.meshSettings = meshSettings; this.viewer = viewer; sampleCentre = coord * meshSettings.meshWorldSize / meshSettings.meshScale; Vector2 position = coord * meshSettings.meshWorldSize; bounds = new Bounds(position, Vector2.one * meshSettings.meshWorldSize); meshObject = new GameObject("Terrain Chunck"); meshRenderer = meshObject.AddComponent <MeshRenderer>(); meshFilter = meshObject.AddComponent <MeshFilter>(); meshCollider = meshObject.AddComponent <MeshCollider>(); meshRenderer.material = material; meshObject.transform.position = new Vector3(position.x, 0, position.y); meshObject.transform.parent = parent; // SetVisible(false); lodMeshes = new LODMesh[detailLeveles.Length]; for (int i = 0; i < detailLeveles.Length; i++) { lodMeshes[i] = new LODMesh(detailLeveles[i].lod); lodMeshes[i].updateCallback += UpdateTerrainChunk; if (i == colliderLODIndex) { lodMeshes[i].updateCallback += UpdateCollisionMesh; } } maxViewDst = detailLeveles[detailLeveles.Length - 1].visibleDstThreshold; }
public static HeightMap GenerateHeightMap(int width, int height, HeightMap_Settings settings, Vector2 sampleCenter) { float[,] values = Noise.GenerateNoiseMap(width, height, settings.noiseSettings, sampleCenter); AnimationCurve heightCurve_threadsafe = new AnimationCurve(settings.heightCurve.keys); float minValue = float.MaxValue; float maxValue = float.MinValue; for (int i = 0; i < width; i++) { for (int j = 0; j < height; j++) { values[i, j] *= heightCurve_threadsafe.Evaluate(values[i, j]) * settings.heightMultiplier; if (values[i, j] > maxValue) { maxValue = values[i, j]; } if (values[i, j] < minValue) { minValue = values[i, j]; } } } return(new HeightMap(values, minValue, maxValue)); }