第一步,将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,

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐