这里写自定义目录标题
为什么用FontForge
因为它是开源免费的,而且项目中我只需要精简字体文件,或者增删个别字形,没有更深层次的需求;
FontForge精简字体文件脚本
这个是核心,用的原生脚本,也就是pe文件,你也可以自行改成python文件,我不会python;代码简单,主要就是传入字符的整型值,如果是-
连接的就是范围型选择,否则是单个选择,然后反选,删除自行,再生成新的字体文件(这里可能不会覆盖同名文件,没测试)。
#调用命令样例: "C:\Program Files (x86)\FontForgeBuilds\bin\fontforge.exe" -script C:\Users\Mike\Documents\FontCut.pe C:\Users\Mike\Documents\Volv-Bold.ttf 65-90 128
if($argc <= 2)
Print("no enough args!")
return(0)
endif
argCnt=$argc - 2
totalArray=Array(argCnt)
index=2
while(index < $argc)
str = StrSplit($argv[index], "-", 2)
strCnt = SizeOf(str)
tmpArr = Array(strCnt)
if(strCnt > 0)
tmpArr[0] = Strtol(str[0])
endif
if(strCnt > 1)
tmpArr[1] = Strtol(str[1])
endif
totalArray[index - 2] = tmpArr
++index
endloop
Open($1)
Reencode("unicode")
totalSize = SizeOf(totalArray)
index = 0
while(index < totalSize)
tmpArr = totalArray[index]
tmpCnt = SizeOf(tmpArr)
if(tmpCnt > 1)
SelectMore(tmpArr[0], tmpArr[1])
elseif(tmpCnt > 0)
SelectMore(tmpArr[0])
endif
++index
endloop
SelectInvert()
DetachAndRemoveGlyphs()
UnlinkReference()
Generate("NewOutputFont.ttf")
Clear()
Close()
Unity中调用cmd执行上述脚本
调用cmd代码:
private void CutFont()
{
var arg = GetArguments();
ProcessStartInfo psInfo = new ProcessStartInfo("cmd.exe");
psInfo.CreateNoWindow = true;
psInfo.UseShellExecute = false;
psInfo.RedirectStandardError = true;
psInfo.RedirectStandardInput = true;
psInfo.RedirectStandardOutput = true;
psInfo.ErrorDialog = true;
psInfo.Arguments = string.Format("/k {0}", arg);
psInfo.StandardOutputEncoding = Encoding.UTF8;
psInfo.StandardErrorEncoding = Encoding.UTF8;
Process ps = Process.Start(psInfo);
//不可使用writeline的方式,输入的命令会被解析为乱码,用上面/k的方式
// ps.StandardInput.WriteLine("ln");
ps.StandardInput.AutoFlush = true;
ps.WaitForExit();
if (ps.ExitCode == 0)
{
Debug.Log("处理成功,请查看处理后字体文件,并进行改名等后续处理. 路径:" + outputPath + "/NewOutputFont.ttf");
}
else
{
Debug.Log(ps.StandardOutput.ReadToEnd());
}
ps.Close();
}
构造参数代码:
private string GetArguments()
{
var result = new StringBuilder();
//fontforge脚本无法指定路径generate,所以先cd到输出目录
result.Append(string.Format("cd \"{0}\" && ", outputPath));
//加入fontforge执行程序路径
result.Append(string.Format("\"{0}\" -script", FontForgeRootPath + "/bin/fontforge.exe"));
result.Append(" ");
//添加精简脚本位置参数, 为防止路径有空格,需要用双引号括起来
result.Append(string.Format("\"{0}\"", scriptPath));
result.Append(" ");
//添加源字体文件位置
result.Append(string.Format("\"{0}\"", sourceFontPath));
result.Append(" ");
//添加字符参数
foreach (var characterPair in _keepCharacters)
{
if (characterPair.Length > 1)
{
result.Append((int)characterPair[0] + "-" + (int)characterPair[1]);
}else
{
result.Append((int)characterPair[0]);
}
result.Append(" ");
}
//最后加上退出代码
result.Append("&& exit");
return result.ToString();
}