using UnityEngine; using UnityEditor; using System.IO; public class ExportSplatMaps : EditorWindow { private Terrain terrain; [MenuItem("Tools/ShirakaTool/Export Terrain SplatMaps")] public static void ShowWindow() { GetWindow("Export SplatMaps"); } private void OnGUI() { GUILayout.Label("导出 Terrain SplatMaps", EditorStyles.boldLabel); terrain = EditorGUILayout.ObjectField("选择 Terrain", terrain, typeof(Terrain), true) as Terrain; if (terrain == null) { EditorGUILayout.HelpBox("请在场景中选择一个 Terrain 对象。", MessageType.Warning); return; } if (GUILayout.Button("导出 SplatMaps")) { ExportSplatMapsToPNG(terrain); } } private void ExportSplatMapsToPNG(Terrain terrain) { TerrainData terrainData = terrain.terrainData; Texture2D[] splatMaps = terrainData.alphamapTextures; string folderPath = EditorUtility.SaveFolderPanel("选择导出文件夹", "", ""); if (string.IsNullOrEmpty(folderPath)) return; for (int i = 0; i < splatMaps.Length; i++) { Texture2D splatMap = splatMaps[i]; RenderTexture rt = RenderTexture.GetTemporary(splatMap.width, splatMap.height, 0, RenderTextureFormat.ARGB32); Graphics.Blit(splatMap, rt); RenderTexture.active = rt; Texture2D readableTex = new Texture2D(splatMap.width, splatMap.height, TextureFormat.ARGB32, false); readableTex.ReadPixels(new Rect(0, 0, rt.width, rt.height), 0, 0); readableTex.Apply(); byte[] bytes = readableTex.EncodeToPNG(); File.WriteAllBytes(Path.Combine(folderPath, $"SplatMap_{i}.png"), bytes); RenderTexture.active = null; RenderTexture.ReleaseTemporary(rt); DestroyImmediate(readableTex); } AssetDatabase.Refresh(); EditorUtility.DisplayDialog("导出完成", "SplatMaps 已成功导出为 PNG 文件。", "确定"); } }