引用:http://blog.csdn.net/akak2010110/article/details/50777846node
上代碼:bash
#if UNITY_EDITOR using UnityEngine; using System.IO; using UnityEditor; using System.Text; using System.Diagnostics; public class CommandBuild : Editor { [MenuItem("Tools/SpritesPacker/CommandBuild")] public static void BuildTexturePacker() { //選擇並設置TP命令行的參數和參數值 string commandText = " --sheet {0}.png --data {1}.xml --format sparrow --trim-mode None --pack-mode Best --algorithm MaxRects --max-size 2048 --size-constraints POT --disable-rotation --scale 1 {2}" ; string inputPath = string.Format ("{0}/Images", Application.dataPath);//小圖目錄 string outputPath = string.Format ("{0}/TexturePacker", Application.dataPath);//用TP打包好的圖集存放目錄 string[] imagePath = Directory.GetDirectories (inputPath); for (int i = 0; i < imagePath.Length; i++) { UnityEngine.Debug.Log (imagePath [i]); StringBuilder sb = new StringBuilder(""); string[] fileName = Directory.GetFiles(imagePath[i]); for (int j = 0; j < fileName.Length; j++) { string extenstion = Path.GetExtension(fileName[j]); if (extenstion == ".png") { sb.Append(fileName[j]); sb.Append(" "); } UnityEngine.Debug.Log("fileName [j]:" + fileName[j]); } string name = Path.GetFileName(imagePath [i]); string outputName = string.Format ("{0}/TexturePacker/{1}/{2}", Application.dataPath,name,name); string sheetName = string.Format("{0}/SheetsByTP/{1}", Application.dataPath, name); //執行命令行 processCommand("D:\\Program Files (x86)\\CodeAndWeb\\TexturePacker\\bin\\TexturePacker.exe", string.Format(commandText, sheetName, sheetName, sb.ToString())); } AssetDatabase.Refresh(); } private static void processCommand(string command, string argument) { ProcessStartInfo start = new ProcessStartInfo(command); start.Arguments = argument; start.CreateNoWindow = false; start.ErrorDialog = true; start.UseShellExecute = false; if(start.UseShellExecute){ start.RedirectStandardOutput = false; start.RedirectStandardError = false; start.RedirectStandardInput = false; } else{ start.RedirectStandardOutput = true; start.RedirectStandardError = true; start.RedirectStandardInput = true; start.StandardOutputEncoding = System.Text.UTF8Encoding.UTF8; start.StandardErrorEncoding = System.Text.UTF8Encoding.UTF8; } Process p = Process.Start(start); if(!start.UseShellExecute) { UnityEngine.Debug.Log(p.StandardOutput.ReadToEnd()); UnityEngine.Debug.Log(p.StandardError.ReadToEnd()); } p.WaitForExit(); p.Close(); } } #endif
#if UNITY_EDITOR using UnityEngine; using System; using System.IO; using UnityEditor; using System.Collections.Generic; using System.Xml; public class MySpritesPacker : Editor { [MenuItem("Tools/SpritesPacker/TexturePacker")] public static void BuildTexturePacker() { string inputPath = string.Format("{0}/SheetsByTP/", Application.dataPath); string[] imagePath = Directory.GetFiles(inputPath); foreach (string path in imagePath) { if (Path.GetExtension(path) == ".png" || Path.GetExtension(path) == ".PNG") { string sheetPath = GetAssetPath(path); Texture2D texture = AssetDatabase.LoadAssetAtPath<Texture2D>(sheetPath); Debug.Log(texture.name); string rootPath = string.Format("{0}/TexturePacker/{1}", Application.dataPath,texture.name); string pngPath = rootPath + "/" + texture.name + ".png"; TextureImporter asetImp = null; Dictionary<string, Vector4> tIpterMap = new Dictionary<string,Vector4>(); if (Directory.Exists(rootPath)) { if(File.Exists(pngPath)) { Debug.Log("exite: " + pngPath); asetImp = GetTextureIpter(pngPath); SaveBoreder(tIpterMap, asetImp); File.Delete(pngPath); } File.Copy(inputPath + texture.name + ".png", pngPath); } else { Directory.CreateDirectory(rootPath); File.Copy(inputPath + texture.name + ".png", pngPath); } AssetDatabase.Refresh(); FileStream fs = new FileStream(inputPath + texture.name + ".xml", FileMode.Open); StreamReader sr = new StreamReader(fs); string jText = sr.ReadToEnd(); fs.Close(); sr.Close(); XmlDocument xml = new XmlDocument(); xml.LoadXml(jText); XmlNodeList elemList = xml.GetElementsByTagName("SubTexture"); WriteMeta(elemList, texture.name, tIpterMap); } } AssetDatabase.Refresh(); } //若是這張圖集已經拉好了9宮格,須要先保存起來 static void SaveBoreder(Dictionary<string,Vector4> tIpterMap,TextureImporter tIpter) { for(int i = 0,size = tIpter.spritesheet.Length; i < size; i++) { tIpterMap.Add(tIpter.spritesheet[i].name, tIpter.spritesheet[i].border); } } static TextureImporter GetTextureIpter(Texture2D texture) { TextureImporter textureIpter = null; string impPath = AssetDatabase.GetAssetPath(texture); textureIpter = TextureImporter.GetAtPath(impPath) as TextureImporter; return textureIpter; } static TextureImporter GetTextureIpter(string path) { TextureImporter textureIpter = null; Texture2D textureOrg = AssetDatabase.LoadAssetAtPath<Texture2D>(GetAssetPath(path)); string impPath = AssetDatabase.GetAssetPath(textureOrg); textureIpter = TextureImporter.GetAtPath(impPath) as TextureImporter; return textureIpter; } //寫信息到SpritesSheet裏 static void WriteMeta(XmlNodeList elemList, string sheetName,Dictionary<string,Vector4> borders) { string path = string.Format("Assets/TexturePacker/{0}/{1}.png", sheetName, sheetName); Texture2D texture = AssetDatabase.LoadAssetAtPath <Texture2D>(path); string impPath = AssetDatabase.GetAssetPath(texture); TextureImporter asetImp = TextureImporter.GetAtPath(impPath) as TextureImporter; SpriteMetaData[] metaData = new SpriteMetaData[elemList.Count]; for (int i = 0, size = elemList.Count; i < size; i++) { XmlElement node = (XmlElement)elemList.Item(i); Rect rect = new Rect(); rect.x = int.Parse(node.GetAttribute("x")); rect.y = texture.height - int.Parse(node.GetAttribute("y")) - int.Parse(node.GetAttribute("height")); rect.width = int.Parse(node.GetAttribute("width")); rect.height = int.Parse(node.GetAttribute("height")); metaData[i].rect = rect; metaData[i].pivot = new Vector2(0.5f, 0.5f); metaData[i].name = node.GetAttribute("name"); if (borders.ContainsKey(metaData[i].name)) { metaData[i].border = borders[metaData[i].name]; } } asetImp.spritesheet = metaData; asetImp.textureType = TextureImporterType.Sprite; asetImp.spriteImportMode = SpriteImportMode.Multiple; asetImp.mipmapEnabled = false; asetImp.SaveAndReimport(); } static string GetAssetPath(string path) { string[] seperator = { "Assets" }; string p = "Assets" + path.Split(seperator, StringSplitOptions.RemoveEmptyEntries)[1]; return p; } } internal class TextureIpter { public string spriteName = ""; public Vector4 border = new Vector4(); public TextureIpter() { } public TextureIpter(string spriteName, Vector4 border) { this.spriteName = spriteName; this.border = border; } } #endif
--批處理根據文件夾生成對應圖集和xml格式ui
echo off set dirName=UI Editor/altas set targetPath=UI Editor/textures cd /d %~dp0 rd /s /q "%~dp0%dirName%" md "%dirName%" echo %~dp0%targetPath% For /f "tokens=*" %%i in ('dir /ad/b "%~dp0%targetPath%"') do ( echo %%i start "" /min ../TexturePacker/bin/TexturePacker.exe --scale 0.5 --max-size 1024 --data "%dirName%"/%%i.xml --format unity --sheet "%dirName%"/%%i.png "%targetPath%" ) pause