Привет можешь улучшить этот скрипт: using UnityEngine;

public class TerrainGenerator : MonoBehaviour
{
    public int width = 256;      // Ширина террейна
    public int depth = 256;      // Глубина террейна
    public float scale = 20f;    // Масштаб шума Perlin
    public float heightScale = 50f; // Максимальная высота

    // Массив слоёв террейна (назначается в инспекторе Unity)
    public TerrainLayer[] terrainLayers;
    public float n1;
    public float n2;
    public float n3;
    public float n4;
    public float n5;
    public float n6;
    private void Start()
    {
        Terrain terrain = GetComponent<Terrain>();
        terrain.terrainData = GenerateTerrain(terrain.terrainData);
        ApplyTextures(terrain.terrainData);
    }

    TerrainData GenerateTerrain(TerrainData terrainData)
    {
        terrainData.heightmapResolution = width + 1;
        terrainData.size = new Vector3(width, heightScale, depth);
        terrainData.SetHeights(0, 0, GenerateHeights());
        return terrainData;
    }

    float[,] GenerateHeights()
    {
        float[,] heights = new float[width, depth];
        for (int x = 0; x < width; x++)
        {
            for (int y = 0; y < depth; y++)
            {
                float xCoord = (float)x / width * scale;
                float yCoord = (float)y / depth * scale;
                heights[x, y] = Mathf.PerlinNoise(xCoord, yCoord);
            }
        }
        return heights;
    }

    void ApplyTextures(TerrainData terrainData)
    {
        float[,,] alphaMap = new float[terrainData.alphamapWidth, terrainData.alphamapHeight, terrainLayers.Length];

        for (int y = 0; y < terrainData.alphamapHeight; y++)
        {
            for (int x = 0; x < terrainData.alphamapWidth; x++)
            {
                float normalizedX = x * 1.0f / terrainData.alphamapWidth;
                float normalizedY = y * 1.0f / terrainData.alphamapHeight;
                float height = terrainData.GetHeight(Mathf.RoundToInt(normalizedY * terrainData.heightmapResolution), Mathf.RoundToInt(normalizedX * terrainData.heightmapResolution)) / heightScale;

                float[] textureWeights = new float[terrainLayers.Length];

                // Инициализируем веса небольшими значениями
                for (int i = 0; i < textureWeights.Length; i++)
                {
                    textureWeights[i] = 0.01f;
                }

                // Распределение текстур по высотным зонам
                textureWeights[0] = height < n1 ? 1 : 0;          // Очень низкая высота
                textureWeights[1] = (height >= n1 && height < n2) ? 1 : 0; // Низкая высота
                textureWeights[2] = (height >= n2 && height < n3) ? 1 : 0; // Средняя высота
                textureWeights[3] = (height >= n3 && height < n4) ? 1 : 0; // Выше средней высоты
                textureWeights[4] = (height >= n4 && height < n5) ? 1 : 0; // Выше средней высоты
                textureWeights[5] = (height >= n5 && height < n6) ? 1 : 0; // Выше средней высоты
                textureWeights[6] = height >= n6 ? 1 : 0;          // Высокая высота

                NormalizeVector(ref textureWeights);

                for (int i = 0; i < textureWeights.Length; i++)
                {
                    alphaMap[x, y, i] = textureWeights[i];
                }
            }
        }

        terrainData.SetAlphamaps(0, 0, alphaMap);
    }

    void NormalizeVector(ref float[] vector)
    {
        float total = 0f;
        foreach (float elem in vector)
        {
            total += elem;
        }

        for (int i = 0; i < vector.Length; i++)
        {
            vector[i] /= total;
        }
    }
}