第一步,将FontAsset的模式改为静态
这样打包时就不会将字体文件打包,而是只打包图集。为了方便增加字库时自动修改图集,我们要在平时使用动态模式。在打包时自动改为静态,打包后在改回动态
。下面是 伪代码
。
TMP_Settings.GetFontAsset().atlasPopulationMode = AtlasPopulationMode.Static;
BuildPipeline.BuildPlayer();
TMP_Settings.GetFontAsset().atlasPopulationMode = AtlasPopulationMode.Dynamic;
第二步,将FontAsset里的图集剥离并压缩
一:剥离图集
先Ctrl+D 手动复制出图集
然后将图集从FontAsset中删除
[MenuItem("Tool/Text/Do")]
public static void Do()
{
if (Selection.activeObject is TMP_FontAsset TMPFontAsset)
{
AssetDatabase.RemoveObjectFromAsset(TMPFontAsset.atlasTexture);
AssetDatabase.SaveAssets();
}
}
进入Debug模式,手动将复制出的图集赋值到箭头指的地方
到这一步,我们已经将图集剥离出来,同时在TextPro中输入新的字能自动加入图集。
二:打开材质球面板的DebugSettings,将图集赋值给材质球
剥离后Text无法显示内容
将图集赋值给材质球
到这一步Text就可以正常显示了,但是这只是临时的,后面我们要用压缩后的图赋值给材质球。
三:压缩
将图集转为png格式保存,然后赋值给FontAsset的材质球。
public Material[] TextMaterials;//所有FontAsset的材质球
public Texture2D TextTexture2D;//复制出的图集
public Texture2D TextPng;//保存的png
public void ReplaceTextTexture()
{
//创建用于压缩的png
byte[] bytes = TextTexture2D.EncodeToPNG();
System.IO.File.WriteAllBytes("Assets/Bundles/font.png", bytes);
TextPng = AssetDatabase.LoadAssetAtPath<Texture2D>("Assets/Bundles/font.png");
//批量赋值,或者只用上面的代码创建png,手动赋值
foreach (var material in TextMaterials)
{
material.SetTexture("_MainTex",TextPng);
}
AssetDatabase.Refresh();
}
接下来修改Size,开启压缩,去掉mipmaps,就完成了。
四:剔除FontAsset中用于更新字库的图集
如果这个图集跟着一块打包了,那么之前的努力就都白费了。
这一步需要修改源代码。
打开 TMP_FontAsset.cs,把m_AtlasTexture改成只有编辑模式下才能序列化
#if UNITY_EDITOR
[SerializeField]
#endif
internal Texture2D m_AtlasTexture;
五:打包测试
我用的是Addressable,