示例#1
0
    public static void ExportTerrainTexture()
    {
        TerrainData terrainData = Selection.activeObject as TerrainData;

        if (terrainData == null)
        {
            EditorUtility.DisplayDialog("Select Terrain", "You Must Select a Terrain first!", "Ok");
            return;
        }

        EditorUtility.DisplayDialog("Select Terrain", "You select the Terrain of " + terrainData.name, "Ok");
        var path = EditorUtility.SaveFilePanel("Save Resource", "", terrainData.name, "png");

        if (path.Length == 0)
        {
            return;
        }

        //Get Ratio
        withRatio   = terrainData.size.x / terrainData.alphamapWidth;
        heightRatio = terrainData.size.z / terrainData.alphamapHeight;

//		//get Terrain size
//		terrainWith   = terrainData.size.x;
//		terrainHeight = terrainData.size.z;
//
//		//Get AlphaMap size
//		alphaMapWith   = terrainData.alphamapWidth;
//		alphaMapHeight = terrainData.alphamapHeight;

//		return;
        //Create return texture
        Texture2D texture = new Texture2D(terrainData.alphamapWidth, terrainData.alphamapHeight, TextureFormat.RGBA32, false);


        //blend map
        float [,,] splatmapData = terrainData.GetAlphamaps(0, 0, terrainData.alphamapWidth, terrainData.alphamapHeight);

//		Color[] colorList = new Color[ splatmapData.GetUpperBound(2) ];//newList<Color>( splatmapData.GetUpperBound(2) );
        for (int i = splatmapData.GetLowerBound(0); i <= splatmapData.GetUpperBound(0); i++)
        {
            for (int j = splatmapData.GetLowerBound(1); j <= splatmapData.GetUpperBound(1); j++)
            {
                int   channel    = splatmapData.GetUpperBound(2);
                Color blendColor = Color.white;
                if (channel == 2)
                {
                    blendColor = new Color(splatmapData[j, i, 0], splatmapData[j, i, 1], splatmapData[j, i, 2], 1);
                }
                else if (channel == 3)
                {
                    blendColor = new Color(splatmapData[j, i, 0], splatmapData[j, i, 1], splatmapData[j, i, 2], splatmapData[j, i, 3]);
                }
                //for ( int k = splatmapData.GetLowerBound(2); k <= splatmapData.GetUpperBound(2); k++ )
                //{
                //    Color color = GetSplatColor( terrainData.splatPrototypes[k], i , j );
                //    blendColor += splatmapData[i, j, k];
                //}
                texture.SetPixel(i, j, blendColor);
            }
        }
//		float [,,] splatmapData = terrainData.GetAlphamaps( 0, 0, terrainData.alphamapWidth, terrainData.alphamapHeight );
//		Texture2D texture = new Texture2D( terrainData.alphamapWidth, terrainData.alphamapHeight,TextureFormat.RGB24, false );

        byte[] bytes = texture.EncodeToPNG();
        File.WriteAllBytes(path, bytes);
    }