上周开始,帮主程给特效做工具,先是写了个用命令行调用TexturePacker,打包指定文件夹图集的工具。解决他们制作特效的时候,被Unity的spritePacker折磨的痛苦,但是写完这个工具,就开始了把他们的痛苦嫁接到我身上了。
打包图集自然很简单,网上随便抄一下,改改参数就完成了。
/// <summary>
/// 命令行打包图集工具
/// </summary>
public static void BuildTexturePacker()
{
//--trim - mode None--pack - mode Best--algorithm MaxRects --max - size 2048--size - constraints POT--disable - rotation--scale 1 --max-size 1024
//选择并设置TP命令行的参数和参数值
string commandText = " --sheet {0}.png --data {1}.tpsheet --format unity-texture2d --width 1024 --height 1024 --shape-padding 5 --force-squared --trim-mode Crop {2}";
Object[] items = Selection.GetFiltered(typeof(Object), SelectionMode.Assets);
if(items == null || items.Length == 0)
{
EditorUtility.DisplayDialog("Fail", "没有选中任何对象,请右键选中文件夹--打该文件夹TP图集!!", "确认");
return;
}
string path = AssetDatabase.GetAssetPath(items[0]);
string inputPath = Application.dataPath + path.Replace("Assets", "");//小图目录
string outputPath = string.Format("{0}/TexturePacker", Application.dataPath);//用TP打包好的图集存放目录
string[] fileName = Directory.GetFiles(inputPath);
StringBuilder sb = new StringBuilder("");
for(int j = 0; j < fileName.Length; j++)
{
string extenstion = Path.GetExtension(fileName[j]);
if(extenstion == ".png")
{
sb.Append(fileName[j]);
sb.Append(" ");
}
Debug.Log("fileName [j]:" + fileName[j]);
}
string name = Path.GetFileName(inputPath);
string sheetName = string.Format("{0}/SheetsByTP/{1}", Application.dataPath, name);
//执行命令行
ShellHelper.ProcessCommand("TexturePacker", string.Format(commandText, sheetName, sheetName, sb.ToString()), null);
AssetDatabase.Refresh();
}
图集是打出来了,接着就要解决替换的问题,我又写了工具,遍历预制去替换现有特效的图片,把现有特效的引用改到图集上,用名称去查找,这种遍历替换也很简单,一会儿就写完了。
替换好了,大家鼓掌,和平一段时间,隔了一周,特效开始给我找茬了,你这个打图集工具,资源怎么对不上号了,我就把A图集的3张图移动到了B图集。What the fuck,还有这种操作,我一看sourceTree的修改记录,由于特效移动图集,然后工具重新打出来的图集,fileID全部变掉了,之前引用到对应的fieldID瞬间错乱。
这就很蛋疼了,你图集好好的还要移动图,还要搞跨图集联欢,那我也不能不做,坑都挖出来了,只能自己跳进去填了,找了好久总算用反射拿到了fieldID,但是怎么都写入不到meta文件,我还尝试读取meta文件,直接替换fieldID,但是,不知道为啥图集文件就被我损坏了,unity给我来个GetObject failed to find Object for Library,真是令人费解,网上也没有解决。
最后实在不行了,认怂,只能遍历预制,读取预制文件的字符串,replace 字符串的fileID: 21300072, guid: 7fd9f5832f43b2f4e889775c7828dbe2,到指定guid和fieldID 用人工来搞定,讲道理这个可以配个表来替换,但是感觉为此写个读表的功能没什么意义,就让这件蛋疼的事情到此为止吧!
记录一下工作上遇到的烦心事。顺便了解了一下Unity记录文件的方式。
1. GUID与fileID(本地ID)
> Unity会为每个导入到Assets目录中的资源创建一个meta文件,文件中记录了GUID,GUID用来记录资源之间的引用关系。还有fileID(本地ID),用于标识资源内部的资源。==资源间的依赖关系通过GUID来确定==;==资源内部的依赖关系使用fileID来确定==。