Unity3D导入TTF生成文字图集的跨平台不确定性问题

Unity3D中,TTF字体可以以动态或静态方式使用,其中静态方式可以通过指定某些字符(某个字符集或者自定义的一些字符)生成文字图集材质及贴图,类似下图这样:
QQ截图20160815092800
而这次要说的问题就出在这个文字图集的贴图上,具体情况是在TTF设置同样的Font Size,Rendering Mode,Character和Custom Chars(使用Custom set字符集模式)的情况下,Unity Editor在不同系统下(Windows和Mac OSX)生成的贴图不一致的问题:
ttf1
可以看到,同一个“格”字生成了不同的字模(朝向、位置都有些许变化)。这个问题,如果是文字图直接拿来用的话还好,但要做一些手脚的话,比如手动修改贴图,实现一些如渐变,描边等艺术字效果的话就会引起麻烦,图集信息不同,要不就得改两次贴图,要不就会显示错乱。

用过位图文字的朋友都知道,贴图上的文字需要有指定的文字信息来做字符编码和贴图uv的匹配,比如Unity也支持导入BMFont等工具生成的位图文字,其中就包含一份每个字符的信息文件,类似这样:

info face=”Arial” size=32 bold=0 italic=0 charset=”” unicode=1 stretchH=100 smooth=1 aa=1 padding=0,0,0,0 spacing=1,1 outline=0
common lineHeight=32 base=26 scaleW=256 scaleH=128 pages=1 packed=0 alphaChnl=1 redChnl=0 greenChnl=0 blueChnl=0
page id=0 file=”GuiNum_0.png”
chars count=10
char id=48 x=0 y=0 width=43 height=46 xoffset=0 yoffset=0 xadvance=43 page=0 chnl=15
char id=49 x=44 y=0 width=43 height=46 xoffset=0 yoffset=0 xadvance=43 page=0 chnl=15
char id=50 x=88 y=0 width=43 height=46 xoffset=0 yoffset=0 xadvance=43 page=0 chnl=15
char id=51 x=132 y=0 width=43 height=46 xoffset=0 yoffset=0 xadvance=43 page=0 chnl=15

并且以这种外部生成方式导入的位图字,在Unity中是可以直接看到每个文字的UV等信息的,如:
QQ截图20160815094352
但由Unity导入TTF直接生成的位图文字却不能直接看到这些信息,而通过Debug面板虽然可以看到类似信息,但全部都是灰色不可修改的:
QQ截图20160815094555
仔细对比Character Rects中每个Element的信息,也可以发现确实有信息不一致的文字。
尝试更换Rendering Mode,发现虽然会改变生成文字图,但效果却不一定是想要的了,而且一些细微的坐标改变等依然会导致图集的不一致问题。
这个问题我想到的有这么几种解决方法:
1.不让Unity生成图集,直接用BMFont等工具生成,这样可以保证一致性,但由于脱离了引擎可能会引起项目管理上的一些不便。
2.较新版本的Unity可以通过Windows平台发布OSX、iOS的项目,这样也可以保证一致性,但iOS的发布时Xcode项目,仍需要拿到Mac上去编译出最终可以执行程序,也是有些不便。
3.修改Unity生成的位图文字信息,保持不同平台下的一致性。
解释一下第3个方法:看到Element信息的时候可以想到,不管是外部工具生成的还是Unity自己生成的,处理这个位图文字的底层应该是一致的,所以Unity本身应该有存放类似.fnt信息的地方,虽然在Editor中可以看到Material和Texture,但Unity并没有在Asset中确实生成mat和贴图文件,Asset中只有你自己放入的资源(这点很赞!),那么Editor中看到的材质和贴图到底存在哪里了呢?最开始我以为是会和.meta有关系,但是查看了下ttf的meta,发现只有Rendering Mode等信息,随后意识到应该是在Unity为项目生成的Library文件夹中,但Library文件夹中相当一部分文件都是引擎自定义的格式以及类似ID的文件名,如何查找哪个才是位图字对应的呢?这个我最开始是用了Process Monitor观察Unity Editor的文件读写操作,还好Unity没有写太多无关的文件,比较轻松的找到了目标,后来意识到,既然如此,完全可以根据Library中文件的修改时间来判断,也就是说,修改一下ttf的设置,比如改几个字,然后Apply,这时Unity会修改Library中对应的资源文件,查看下最近修改时间,便可轻松定位到目标文件了(metadata\2d中的2dfbb341ecd1a1c4ab735e3ebbd1f1ec),有兴趣的可以打开这个文件看下,虽然是引擎自定义格式,但并没有压缩或加密,可以看到其中有PNG段,拆出来看下确实是生成的位图字贴图!这样把一个平台的这个文件拷到另一个平台的项目下就可以了,重开下项目就可以看到一直的图集了。

博主友情提示:

如在您的评论中需要提及如QQ号、微信号、电子邮件地址或其他隐私敏感信息,欢迎通过>>博主专用加密工具v2<<加密后发布,原文只有博主可以看到。