美文网首页
Unity游戏FontPruner字体压缩工具

Unity游戏FontPruner字体压缩工具

作者: LEO_青蛙 | 来源:发表于2019-12-05 19:13 被阅读0次

    FontPruner 字体精简工具
    我将FontPruner改写成Unity插件的形式,可以直接在Unity编辑器中使用
    FontPrunerEditor.cs放在Editor文件夹中

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEditor;
    using System.Diagnostics;
    using System.IO;
    
    public class FontPrunerEditor : Editor
    {
        [MenuItem ("Assets/Execute FontPruner", false, 50)]
        private static void ExecuteFontPruner ()
        {
            //第一步:检查必要的文件是否存在
            //sfnttool.jar  压缩工具
            //Custom.txt    压缩内容
            string rootPath = Application.dataPath.Replace("Assets", "");
            string fontPath = AssetDatabase.GUIDToAssetPath(Selection.assetGUIDs[0]);
            string fontName = fontPath.Substring(fontPath.LastIndexOf("/")+1);
            string[] nameArr = fontName.Split('.');
            string targetFontName = nameArr[0] + "-min." + nameArr[1];
            string dataPath = rootPath + fontPath.Replace(fontName, "");
    
            string toolPath = dataPath + "sfnttool.jar";
            string textPath = dataPath + "Custom.txt";
            if(!File.Exists(toolPath))
            {
                UnityEngine.Debug.Log("缺少sfnttool.jar");
                return;
            }
            if(!File.Exists(textPath))
            {
                UnityEngine.Debug.Log("缺少Custom.txt");
                return;
            }
    
            //第二步:执行python脚本(需要传递参数)
            //参数1:字体文件路径
            //参数2:压缩前的字体文件名称
            //参数3:压缩后的字体文件名称
            ProcessStartInfo startInfo = new ProcessStartInfo();
            startInfo.FileName = "python";
            startInfo.Arguments = dataPath + "FontPruner.py " + dataPath + " " + fontName + " " + targetFontName;
            startInfo.UseShellExecute = false;
            startInfo.RedirectStandardOutput = true;
            Process process = Process.Start(startInfo);
            process.BeginOutputReadLine();
            process.OutputDataReceived += new DataReceivedEventHandler(DataReceivedEvent);
            process.WaitForExit();
            process.Close();
            
            AssetDatabase.Refresh();
            UnityEngine.Debug.Log("字体压缩完成");
        }
    
        private static void DataReceivedEvent(object sender, DataReceivedEventArgs e)
        {
            if (!string.IsNullOrEmpty(e.Data)) {
                UnityEngine.Debug.Log (e.Data);
            }
        }
    
        [MenuItem ("Assets/Execute FontPruner", true)]
        private static bool ValidateExecuteFontPruner ()
        {
            return Selection.activeObject.GetType () == typeof(Font);
        }
    }
    

    FontPruner.py放在字体文件的同一目录下

    #!/bin/python
    
    import os
    import sys
    
    #print(sys.argv)
    
    dataPath = sys.argv[1]
    sourceFontName = sys.argv[2]
    targetFontName = sys.argv[3]
    
    toolPath = dataPath + "sfnttool.jar"
    customTextPath = dataPath + "Custom.txt"
    sourceFontPath = dataPath + sourceFontName
    targetFontPath = dataPath + targetFontName
    
    print(targetFontPath)
    
    command = "java -jar " + toolPath + " -c " + customTextPath + " " + sourceFontPath + " " + targetFontPath
    
    print(command)
    
    os.system(command)
    

    知识点:
    (1)在Unity编辑器中,通过Process执行python脚本(shell脚本)
    (2)使用sfntly中的sfnttool.jar提取中文字体

    FontPruner压缩字体
    FontForge查看字体

    相关文章

      网友评论

          本文标题:Unity游戏FontPruner字体压缩工具

          本文链接:https://www.haomeiwen.com/subject/nwdjgctx.html