?腳本源代碼:
#if UNITY_EDITOR
using UnityEditor;
using UnityEngine;
using System.IO;
using UnityEditorInternal;
using System.Collections.Generic;
using System;public class TextureImporterWindow : EditorWindow
{private string folderPath = "D:/";private string filePath = "D:/";private string searchPattern = "*.png";private string savePath = "C:/Users/26679/Desktop";[MenuItem("Tools/導入圖片")]public static void ShowWindow(){GetWindow<TextureImporterWindow>("導入圖片窗口");}[Obsolete]void OnGUI(){// 頂部留白10像素GUILayout.Space(10);EditorGUILayout.BeginVertical("box");GUILayout.Label("文件夾導入", EditorStyles.boldLabel);// 路徑設置folderPath = EditorGUILayout.TextField("文件夾路徑:", folderPath);// 文件過濾searchPattern = EditorGUILayout.TextField("篩選文件格式:", searchPattern);EditorGUILayout.BeginHorizontal();if (GUILayout.Button("瀏覽", GUILayout.Width(80))){folderPath = EditorUtility.OpenFolderPanel("選擇一個文件夾", "D:/", "");}// 導入按鈕if (GUILayout.Button("全部導入")){if (Directory.Exists(folderPath)){ImportTexturesFromFolder(folderPath, searchPattern);}else{EditorUtility.DisplayDialog("Error", "文件夾不存在!", "OK");}}EditorGUILayout.EndHorizontal();GUILayout.EndVertical();GUILayout.Space(20);EditorGUILayout.BeginVertical("box");GUILayout.Label("單個圖片導入", EditorStyles.boldLabel);EditorGUILayout.BeginHorizontal("box");filePath = EditorGUILayout.TextField("圖片路徑:", filePath);if (GUILayout.Button("瀏覽", GUILayout.Width(80))){// 打開文件選擇對話框filePath = EditorUtility.OpenFilePanel("請選擇圖片文件", "", "png,jpg,jpeg");}// 導入按鈕if (GUILayout.Button("導入")){if (!string.IsNullOrEmpty(filePath)){ImportTexturesFromFile(filePath);}else{EditorUtility.DisplayDialog("Error", "文件不存在!", "OK");}}EditorGUILayout.EndHorizontal();EditorGUILayout.EndVertical();GUILayout.Space(20);EditorGUILayout.BeginVertical("box");GUILayout.Label("將選中的Texture資源全部切片(用于將精靈表每一幀切割成片)", EditorStyles.boldLabel);// 切割按鈕if (GUILayout.Button("切片為Sprites")){// 獲取所有選中的紋理資源Texture2D[] textures = Selection.GetFiltered<Texture2D>(SelectionMode.Assets);if (textures.Length > 0){foreach (Texture2D texture in textures){string path = AssetDatabase.GetAssetPath(texture);TextureImporter importer = AssetImporter.GetAtPath(path) as TextureImporter;if (importer != null){importer.textureType = TextureImporterType.Sprite;//紋理類型為Sprite// importer.spriteImportMode = SpriteImportMode.Single;//Sprite模式為多個;importer.filterMode = FilterMode.Point;//過濾模式為點; 對像素圖處理比較好,還有其它雙線算法;importer.textureCompression = TextureImporterCompression.Uncompressed;//不壓縮;importer.isReadable = true;//可讀寫;importer.maxTextureSize = 2048;importer.SaveAndReimport();}else{Debug.Log("導入設置失敗!");}DoAutomaticSlicing(false, texture);}}else{Debug.LogWarning("0 個Texture2D 資源被選中!");}}EditorGUILayout.BeginHorizontal("box");savePath = EditorGUILayout.TextField("保存路徑:", savePath);if (GUILayout.Button("瀏覽", GUILayout.Width(80))){// 打開文件選擇對話框savePath = EditorUtility.OpenFolderPanel("選擇一個文件夾", "D:/", "");}// 切割按鈕if (GUILayout.Button("切片導出png")){// 獲取所有選中的紋理資源Texture2D[] textures = Selection.GetFiltered<Texture2D>(SelectionMode.Assets);if (textures.Length > 0){foreach (Texture2D texture in textures){string path = AssetDatabase.GetAssetPath(texture);TextureImporter importer = AssetImporter.GetAtPath(path) as TextureImporter;if (importer != null){importer.textureType = TextureImporterType.Sprite;//紋理類型為Spriteimporter.spriteImportMode = SpriteImportMode.Multiple;//Sprite模式為多個;importer.filterMode = FilterMode.Point;//過濾模式為點; 對像素圖處理比較好,還有其它雙線算法;importer.textureCompression = TextureImporterCompression.Uncompressed;//不壓縮;importer.isReadable = true;//可讀寫;importer.maxTextureSize = 2048;importer.SaveAndReimport();}else{Debug.Log("導入設置失敗!");}DoAutomaticSlicing(true, texture);}}else{Debug.LogWarning("0 個Texture2D 資源被選中!");}}EditorGUILayout.EndHorizontal();EditorGUILayout.EndVertical();GUILayout.Space(20);if (GUILayout.Button("test")){Debug.Log("This is a test!");//測試代碼;}}#region 圖片導入void ImportTexturesFromFolder(string path, string pattern){string[] files = Directory.GetFiles(path, pattern, SearchOption.AllDirectories);string projectPath = Application.dataPath;string targetFolder = "Assets/ImportedTextures/" + new DirectoryInfo(folderPath).Name + "/";// 創建目標文件夾if (!AssetDatabase.IsValidFolder(targetFolder)){AssetDatabase.CreateFolder("Assets", "ImportedTextures");AssetDatabase.CreateFolder("Assets/ImportedTextures", new DirectoryInfo(folderPath).Name);}int successCount = 0;foreach (string file in files){try{string fileName = Path.GetFileName(file);string destPath = Path.Combine(targetFolder, fileName);// 復制文件到項目目錄File.Copy(file, destPath, true);// Debug.Log($"復制: {file} -> {destPath}");successCount++;}catch (System.Exception e){Debug.LogError($"導入失敗 {file}: {e.Message}");}}// 刷新資源數據庫AssetDatabase.Refresh();// 設置導入設置foreach (string file in files){string fileName = Path.GetFileName(file);string assetPath = $"{targetFolder}{fileName}";TextureImporter importer = AssetImporter.GetAtPath(assetPath) as TextureImporter;if (importer != null){importer.textureType = TextureImporterType.Sprite;//紋理類型為Spriteimporter.spriteImportMode = SpriteImportMode.Multiple;//Sprite模式為單個;importer.filterMode = FilterMode.Point;//過濾模式為點; 對像素圖處理比較好,還有其它雙線算法;importer.textureCompression = TextureImporterCompression.Uncompressed;//不壓縮;importer.isReadable = true;//可讀寫;importer.maxTextureSize = 2048;importer.SaveAndReimport();}else{Debug.Log("importer 為null");}}EditorUtility.DisplayDialog("導入完成",$"導入成功 {successCount}/{files.Length} textures", "OK");}void ImportTexturesFromFile(string file){string projectPath = Application.dataPath;string targetFolder = "Assets/ImportedTextures/";// 創建目標文件夾if (!AssetDatabase.IsValidFolder(targetFolder)){AssetDatabase.CreateFolder("Assets", "ImportedTextures");}try{string fileName = Path.GetFileName(file);string destPath = Path.Combine(targetFolder, fileName);// 復制文件到項目目錄File.Copy(file, destPath, true);// Debug.Log($"Copied: {file} -> {destPath}");// 刷新資源數據庫AssetDatabase.Refresh();// 設置導入設置string assetPath = $"Assets/ImportedTextures/{fileName}";TextureImporter importer = AssetImporter.GetAtPath(assetPath) as TextureImporter;if (importer != null){importer.textureType = TextureImporterType.Sprite;//紋理類型為Spriteimporter.spriteImportMode = SpriteImportMode.Multiple;//Sprite模式為單個;importer.filterMode = FilterMode.Point;//過濾模式為點; 對像素圖處理比較好,還有其它雙線算法;importer.textureCompression = TextureImporterCompression.Uncompressed;//不壓縮;importer.isReadable = true;//可讀寫;importer.maxTextureSize = 2048;importer.SaveAndReimport();}EditorUtility.DisplayDialog("導入完成!",$"成功導入 1 textures", "OK");}catch (System.Exception e){Debug.LogError($"Failed to import {file}: {e.Message}");}}#endregion#region Slice圖片[Obsolete]private void DoAutomaticSlicing(bool isExport, Texture2D OrigonTxr, int minimumSpriteSize = 4){Texture2D copyTexture = new Texture2D(OrigonTxr.width, OrigonTxr.height);copyTexture.SetPixels(OrigonTxr.GetPixels());copyTexture.Apply();Rect[] one = InternalSpriteUtility.GenerateAutomaticSpriteRectangles(copyTexture, minimumSpriteSize, 0);List<Rect> frames = new List<Rect>(one);frames = SortRects(frames, OrigonTxr.width);int index = 0;if (isExport){foreach (Rect frame in frames){ExportSpriteRectToPNG(OrigonTxr, frame, index++);}Debug.Log($"源{OrigonTxr.name}已經成功導出{index}張png圖片,并保存到:{savePath}");}else{string path = AssetDatabase.GetAssetPath(OrigonTxr);TextureImporter importer = AssetImporter.GetAtPath(path) as TextureImporter;if (importer != null){importer.textureType = TextureImporterType.Sprite;//紋理類型為Spriteimporter.spriteImportMode = SpriteImportMode.Multiple;//Sprite模式為多個;importer.filterMode = FilterMode.Point;//過濾模式為點; 對像素圖處理比較好,還有其它雙線算法;importer.textureCompression = TextureImporterCompression.Uncompressed;//不壓縮;importer.isReadable = true;//可讀寫;importer.maxTextureSize = 2048;importer.SaveAndReimport();}else{Debug.Log("importer 為null");}List<SpriteMetaData> metas = new List<SpriteMetaData>();//于生成精靈的編輯器數據。表的名字;用于給子圖命名;foreach (Rect rect in frames)//生成精靈小圖;{SpriteMetaData meta = new SpriteMetaData();meta.rect = rect;meta.name = OrigonTxr.name + "_" + index++;metas.Add(meta);}importer.spritesheet = metas.ToArray();//精靈小圖數組添加到父精靈圖后;Debug.Log($"{OrigonTxr.name}成功生成{metas.Count} 個子Sprites ! ");}}// 1. Find top-most rectangle// 2. Sweep it vertically to find out all rects from that "row"// 3. goto 1.// This will give us nicely sorted left->right top->down list of rectangles// Works for most sprite sheets pretty nicelyprivate List<Rect> SortRects(List<Rect> rects, int width){List<Rect> result = new List<Rect>();while (rects.Count > 0){// Because the slicing algorithm works from bottom-up, the topmost rect is the last one in the arrayRect r = rects[rects.Count - 1];Rect sweepRect = new Rect(0, r.yMin, width, r.height);List<Rect> rowRects = RectSweep(rects, sweepRect);if (rowRects.Count > 0)result.AddRange(rowRects);else{// We didn't find any rects, just dump the remaining rects and continueresult.AddRange(rects);break;}}return result;}private List<Rect> RectSweep(List<Rect> rects, Rect sweepRect){if (rects == null || rects.Count == 0)return new List<Rect>();List<Rect> containedRects = new List<Rect>();foreach (Rect rect in rects){if (rect.Overlaps(sweepRect))containedRects.Add(rect);}// Remove found rects from original listforeach (Rect rect in containedRects)rects.Remove(rect);// Sort found rects by x positioncontainedRects.Sort((a, b) => a.x.CompareTo(b.x));return containedRects;}#endregion#region 導出 png文件// public Sprite spriteToExport;// public Rect rectToExport;private void ExportSpriteRectToPNG(Texture2D texture, Rect rectToExport, int index){if (texture == null){Debug.LogError("要導出的源Texture2D為空!");return;}// 計算裁剪區域在Texture2D中的實際坐標int x = (int)rectToExport.x;int y = (int)rectToExport.y;int width = (int)rectToExport.width;int height = (int)rectToExport.height;// 創建新的Texture2D對象,用于存儲裁剪后的像素數據Texture2D outputTexture = new Texture2D(width, height, TextureFormat.RGBA32, false);Color[] pixels = texture.GetPixels(x, y, width, height);outputTexture.SetPixels(pixels);outputTexture.Apply();// 編碼為PNG格式byte[] pngData = outputTexture.EncodeToPNG();// 保存文件if (pngData != null){// string filenameNoExtension = Path.GetFileNameWithoutExtension('origonPath');File.WriteAllBytes(savePath + "/" + texture.name + '_' + index + ".png", pngData);}else{Debug.LogError("無法將" + savePath + texture.name + '_' + index + ".png" + "編碼為PNG文件!");}}#endregion}
#endif
演示:?
?