예제 #1
0
    public void GenerateLevel()
    {
        #region Getting refs to components
        meshFilter   = GetComponent <MeshFilter>();
        meshCollider = GetComponent <MeshCollider>();
        meshRenderer = GetComponent <MeshRenderer>();
        #endregion

        #region Generating offset, heightMap, texture and mesh

        var verts     = meshFilter.mesh.vertices;
        var levelSize = (int)Mathf.Sqrt(verts.Length);
        var offset    = new Vector2(
            -transform.position.x / transform.localScale.x,
            -transform.position.z / transform.localScale.z
            ) + globalOffset;
        float[,] heightMap;
        if (simple)
        {
            //print("Level gened simple!");
            heightMap = NoiseMap.Get(levelSize, levelSize, mapScale, offset);
        }
        else
        {
            //print("Level gened with waves!");
            heightMap = NoiseMap.GetComplex(levelSize, levelSize, mapScale, offset, waves);
        }
        var texture = NoiseMap.AsColorTexture(heightMap, terrainColors, terrainColorThresholds);
        if (meshRenderer)
        {
            meshRenderer.material.mainTexture = texture;
        }

        for (int z = 0, vertInd = 0; z < levelSize; z++)
        {
            for (var x = 0; x < levelSize; x++, vertInd++)
            {
                var height = heightMap[z, x];
                var vertex = verts[vertInd];
                verts[vertInd] = new Vector3(vertex.x, heightCurve.Evaluate(height) * heightMultiplier, vertex.z);
            }
        }

        #endregion



        #region Applying all the stuff
        meshFilter.mesh.vertices = verts;
        meshFilter.mesh.RecalculateNormals();
        meshFilter.mesh.RecalculateBounds();
        if (meshCollider)
        {
            meshCollider.sharedMesh = meshFilter.mesh;
        }
        #endregion
    }