【求知探新】Unity中字体名对依赖关系的影响

【求知探新】Unity中字体名对依赖关系的影响

【求知探新】在UWA团队做性能优化的过程中,常常会遇到一些未知的问题,在这里我们将分享UWA研究这些问题的完整过程。当然需要说明的是,一个好的问题没有标准的答案,在此也欢迎大家来积极拍砖!

今天分享的内容,来自我们对UWA问答社区中《求助有关字体依赖的问题》一帖的研究。


一、问题描述

两个没有相关性的字体,在Unity里导入的时候,会产生依赖关系。


二、问题复现

研发团队做了一个测试Demo,导入了两个字体“PKCommonFont.ttf”和“Normal.ttf”。并在测试之前确认过这两个字体资源,无论是从字体本身,还是Unity里面的Font Name等地方,都没有看到相关性,但是却能通过AssetDatabase.GetDependencies(ttfPath)方法找到两者之间的依赖关系。在实际加载的时候,加载PKCommonFont时,也会加载Normal字体。
请输入图片描述


三、问题分析

在我们研究该问题的过程中,我们慢慢发现,当字体为Dynamic类型时,其会根据Font Names建立关联,此处的Font Names不是指字体文件的文件名,而是指字体内部名(TrueTypeFontImporter.fontTTFName)。示例中的 “Normal” 和 “PKCommonFont” 都只是文件名,而其字体内部名都是“Source Han Sans CN”;而当出现相同字体内部名的字体文件时,Editor会自动在其之间建立关联(后出现在project中的字体会关联先出现的字体)。这也就是为什么示例中两个完全不同字体会产生关联的原因。同时,为了验证这一问题,我们也尝试将两个字体的FontName进行修改,让其不再相同,果然,这两种字体的依赖关系就消失了。


四、解决方案

1、较为合理的解除关联的方法:
重命名字体内部名,使获取的TrueTypeFontImporter.fontTTFName不相同即可。

2、较为方便的解除关联的方法:
修改ttf对应的meta文件,将其中的fallbackFontReferences:[]修改为
请输入图片描述

以下是测试过程:

方法一:用FontCreator修改FontName
使用了FontCreator(9.1)修改FontName,步骤如下:
1)用FontCreator打开PKCommonFont.ttf文件后,通过【字体】【属性】打开属性面板。
2)切换到【扩展】页签,修改【字体族】为“PKCommonFont”。
3)导出:【文件】【导出字体为】选择TrueType字体,字体名称选择【版本重新生成】,导出PKCommonFont2.ttf。

下图为修改前后两个字体的meta文件对比,左为修改前,右为修改后。
请输入图片描述

下图为修改后的运行结果,可以看到PKCommonFont2.ttf不再依赖Normal.ttf。
请输入图片描述

方法二:修改有依赖问题的ttf的meta文件
下图为meta文件的修改前后对比,左为修改后,右为修改前。
请输入图片描述

下图为修改后的运行结果,可以看到PKCommonFont.ttf不再依赖Normal.ttf。
请输入图片描述


五、结论

当明确Unity使用的是字体资源的内部名后,字体间产生关联的原因也就水落石出。该问题的困惑源自字体资源文件名与字体内部名不一致,因而建议研发团队在为字体资源文件命名时尽量与字体内部名称一一对应,来避免在使用过程中受到文件名干扰。

至此,该问题已经得到了解决。该问题来自于问答社区:https://answer.uwa4d.com/question/5a697bf17daacf4c7ff04928,如您对该问题仍有疑问,可以转至社区进行进一步交流。


我们欢迎大家在UWA问答社区(answer.uwa4d.com)积极提交研发过程中遇到的问题。也许随着时间的流逝,科技的进步,答案将变得廉价,但问题会变得更有价值,因为提问和研究将比回答更有力量。