Unity项目增加字体裁剪

因为项目里有字体裁剪缩小字体文件的需求,在网上搜索了一番。
有个很靠谱的参考文章:
https://www.cnblogs.com/yaukey/p/compare_fontsubsetgui_fontpruner_for_unity.html
然后就使用了这篇文章里提到的FontPruner工具。
下载之后就是文章置顶附件这样的jar包,放入工程里。

需要编写脚本,根据表格工具导出的项目文本对应字体的txt文件,再使用裁剪工具进行裁剪。

private static void ExecuteFontPruner(string fontName)
        {
            UnityEngine.Debug.Log($"[FontCreateTool]:开始重新生成 [{fontName}] 字体");
            var txtPath = $"{fontToolPath}/{fontName}.txt";
            var fontFullPath = Application.dataPath + $"{fontOriginResPath}/{fontName}.ttf";
            fontFullPath = fontFullPath.Replace("Assets/", "");
            var newFontPath = $"{resourcePath}/{fontName}.bytes";
            if (!File.Exists(txtPath))
            {
                UnityEngine.Debug.LogError($"[FontCreateTool]:{txtPath} 路径不存在");
                return;
            }
            if (!File.Exists(fontFullPath))
            {
                UnityEngine.Debug.LogError($"[FontCreateTool]:{fontFullPath} 路径不存在");
                return;
            }

            var workingPath = GetFullPath(fontPrunerPath);
            var fileName = "java";
            //java -jar sfnttool.jar -s '需要提取的字体' 源字体库 导出的最终字体库
            var commandLine = " -jar bin/sfnttool.jar -c " +
                              GetFullPath(txtPath) + " " +
                              fontFullPath + " " +
                              GetFullPath(newFontPath);
            UnityEngine.Debug.Log($"[FontCreateTool]:[FontPruner-DoProcess]commandLine: {commandLine}");
            Process process = Process.Start(
                new ProcessStartInfo(fileName, commandLine)
                {
                    RedirectStandardError = true,
                    RedirectStandardOutput = true,
                    UseShellExecute = false,
                    CreateNoWindow = true,
                    WorkingDirectory = workingPath,
                    // http://stackoverflow.com/questions/16803748/how-to-decode-cmd-output-correctly
                    // Default = 65533, ASCII = ?, Unicode = nothing works at all, UTF-8 = 65533, UTF-7 = 242 = WORKS!, UTF-32 = nothing works at all
                    StandardOutputEncoding = Encoding.GetEncoding(850)
                });

            if (!process.WaitForExit(timeOut))
            {
                UnityEngine.Debug.LogWarning("[FontCreateTool]: FontPruner took too long to finish.  Killing operation.");
                process.Kill();
            }

            string error = process.StandardError.ReadToEnd();
            if (!string.IsNullOrEmpty(error))
            {
                UnityEngine.Debug.LogError(error);
            }

            string output = process.StandardOutput.ReadToEnd();
            if (!string.IsNullOrEmpty(output))
            {
                UnityEngine.Debug.Log(output);
            }

            AssetDatabase.Refresh();
            UnityEngine.Debug.Log("[FontCreateTool]:字体裁剪完成");
        }

实际使用中,有些字体在裁剪的过程中会碰到报错:

Exception in thread “main” java.lang.IndexOutOfBoundsException: Index attempted to be read from is out of bounds: a34c

实际发现是因为字体库里有很多没定义的字形,使用FontCreator工具编辑ttf,把没用的全删除掉之后再调用裁剪就不报错了。

再附一个【FontCreator注册码】网站,毕竟我找了半天……之前免费用一段时间就卸注册表,太麻烦了。
https://www.huajclub.com/8068.html

你可能感兴趣的:(unity,游戏引擎)