# 前言

在上一篇 关于 AssetBundleManifest 使用 文章我就写了,我们项目最近搞 微信小游戏 版本

那么这个版本肯定是主要面向 国内 ,那么就可以考虑 ASTC 格式了,于是索性全部切为 ASTC ,安卓、IOS 统一

然后就发现,之前通过 TexturePacker 生成的 UI图集 ,基本上都是选择了 Force Squared(强制方形分辨率) 选项的 —— 应该是为了兼容 IOS 平台的 PVRTC 格式。

不过现在统一换成 ASTC 就没这样的必要了,免得浪费内存。

于是就想着批量处理一波

虽然其实很简单,不过还是记录一下,以后没准什么时候就又用到了。

# 经过

一开始本来想直接调用 TexturePacker 提供的命令行指令,直接重打包去掉 强制立方体分辨率 选项的,结果发现不行:

文档 - Texture-settings

Force squared --force-squared
Forces the texture to have a squared size.

强制立方体分辨率选项的命令行就上边这么一行,没有额外参数 —— 也就是说:只能强制设置为立方体,若 TPS 本来就勾了,靠命令行就没法设置为 False 了:

我尝试了在后面跟上各种额外参数,例如:

TexturePacker.exe Atlas_ChatView_New1.tps --force-squared false

确实也没什么效果。

然后偶然点开 *.tps 文件,发现这东西其实是 Xml 格式的 纯文本

那这不就简单了,直接按照修改文本的方式改一波,再根据 tps 设置打一次图集就好了。

(虽然此时同事建议我找个初级的手改,不过感觉写代码也花不了多少时间,于是还是用代码处理了)

# 重设代码

[MenuItem("Tools/=>重设项目所有图集<=")]
public static void ReSetting()
{
    if (EditorUtility.DisplayDialog("提示", "该操作将会重设项目所有图集,确定?", "确定"))
    {
        string resDir = Path.Combine(Application.dataPath, "Resources/Ui");
        ReSetting("第1个图集目录", Directory.GetFiles(resDir, "*.tps", SearchOption.AllDirectories));
        resDir = Path.Combine(Application.dataPath, "Resources/Ui_New");
        ReSetting("第2个图集目录", Directory.GetFiles(resDir, "*.tps", SearchOption.AllDirectories));
        resDir = Path.Combine(Application.dataPath, "Resources/UIPrefab");
        ReSetting("第3个图集目录", Directory.GetFiles(resDir, "*.tps", SearchOption.AllDirectories));
    }
    EditorUtility.ClearProgressBar();
}
private static void ReSetting(string tipsName, string[] atlasTpsList)
{
    string path;
    string[] lines;
    string line;
    for (int i = 0; i < atlasTpsList.Length; i++)
    {
        EditorUtility.DisplayProgressBar("处理:" + tipsName, string.Format("当前处理进度:{0}/{1}", (i + 1), atlasTpsList.Length), (i + 1) / (float)atlasTpsList.Length);
        path = atlasTpsList[i];
        lines = File.ReadAllLines(path);
        for (int lineindex = 0; lineindex < lines.Length; lineindex++)
        {
            line = lines[lineindex];
            if (line.EndsWith("<key>maxTextureSize</key>"))
            {
                ReSetSize(lines, ref lineindex, "2048");
            }
            else if (line.EndsWith("<key>fixedTextureSize</key>"))
            {
                ReSetSize(lines, ref lineindex, "-1");
            }
            else if (line.EndsWith("<key>forceSquared</key>"))
            {
                lines[++lineindex] = "            <false/>";
            }
        }
        File.WriteAllLines(path, lines);
    }
}
private static void ReSetSize(string[] lines, ref int index, string size)
{
    index++;
    lines[index++] = "        <QSize>";
    lines[index++] = "            <key>width</key>";
    lines[index++] = string.Concat("            <int>", size, "</int>");
    lines[index++] = "            <key>height</key>";
    lines[index++] = string.Concat("            <int>", size, "</int>");
    lines[index] = "        </QSize>";
}

# 总结

就是这样,TexturePacker 提供的命令行参数感觉比较散,更适合纯命令行调用,比如一开始就写打图集的脚本,规定好各项参数。

要是加上 TPS 设置的话,有些参数就没法去修改了。

不过还好 TPS 文本本身是纯文本,要是二进制,那要是不深入研究官方的存储格式,可能就真只能手改了。