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;
    }
Пример #2
0
    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));
    }