Unity TextMeshPro(二)优化
文章目录
- 前言
- 一、字体打包优化
- 二、ab打包冗余
- 1、问题
- 1、解决方法
- 三、字体静态优化
- 四、扩展
- 总结
前言
优化TextMeshPro包体大小的方法记录。
一、字体打包优化
游戏开发阶段通常使用Fast打包方式,在正式项目发布的时候需要切换一下打包方式,重新将字体打包,会获得更好的性能。(注:打包时间长达30分钟以上,想要精度更高选择SDF8等渲染模式将会更慢)
二、ab打包冗余
1、问题
打ab包时,预制体使用TMP会把字体打进预制中形成冗余,体积增大的同时打包速度更是如蜗牛般缓慢。解决方法,参考网上解决方案:
http://t.csdnimg.cn/3yLlC
1、解决方法
方法为直接修改源码加载方式,下面简述其过程:
将TMP插件下的 Resources 文件夹改名为TMPPro,将字体、txt文本移动至Fonts文件夹
将TMP的包com.unity.textmeshpro从Library下移动至Packages并将文件和子文件取消只读勾选(项目不需要上传git平台忽略此步)
找到Packages\com.unity.textmeshpro\Scripts\Runtime\TMP_Setting.cs和Packages\com.unity.textmeshpro\Scripts\Editor\TMP_SettingsEditor.cs
1、修改TMP_Setting.cs
public static TMP_Settings instance{get{if (s_Instance == null){//s_Instance = Resources.Load<TMP_Settings>("TMP Settings");#if UNITY_EDITORs_Instance =UnityEditor.AssetDatabase.LoadAssetAtPath<TMP_Settings>("Assets/TextMesh Pro/TMPPro/TMP Settings.asset");// Make sure TextMesh Pro UPM packages resources have been added to the user projectif (s_Instance == null && Time.frameCount != 0){// Open TMP Resources ImporterTMP_PackageResourceImporterWindow.ShowPackageImporterWindow();}
#endif}return s_Instance;}set { TMP_Settings.s_Instance = value; }}
2、修改TMP_SettingsEditor
static UnityEngine.Object GetTMPSettings(){//return Resources.Load<TMP_Settings>("TMP Settings");return UnityEditor.AssetDatabase.LoadAssetAtPath<TMP_Settings>("Assets/TextMesh Pro/TMPPro/TMP Settings.asset");}
3、打包测试一下,看来TMP_Settings只在Editor模式下加载,必须在运行时也添加相应的加载代码,否则会出现以下情况
4、加载AB包后赋值。如何加载?我只能说懂得都懂,额,其实是因为大家使用的ab加载方式不同,所以加载方式会略有不同。为了防止刚接触的萌新不懂,我这里用伪代码列举一下:
using UnityEngine;
using System.Reflection;public class Main : MonoBehaviour
{//拖拽或者通过加载ab等方式获取public TMPro.TMP_Settings TMP_Settings; private void Awake(){//初始化游戏热更框架Asset.Instance.InitFrameWork();}void Start(){//热更资源-完成后回调StartGame方法HotUpdateManager.Instance.HotAndUnPackAssets(xxx, StartGame);}/// <summary>/// 开始游戏,加载登录界面/// </summary>public void StartGame(){LoadTMP_Setting();UIModule.Instance.Initialize();UIModule.Instance.OpenWindow<LoginWindow>();}private void LoadTMP_Setting() {var settingsType = TMP_Settings.GetType();var settingsInstanceInfo = settingsType.GetField("s_Instance", BindingFlags.Static | BindingFlags.NonPublic);settingsInstanceInfo.SetValue(null, TMP_Settings);}}
5、如果有ab框架,那么则需要在框架中提前加入这个固定的字体依赖或者排除冗余,然后再特定时机加载
7、完美解决
三、字体静态优化
接下来我们打包ab时会非常迅速,但会出现包体过大的问题,本来几十k、几百k的文件打ab包后会增加数十倍。
原因之一是打包时使用了动态字体,那我们在打包时将字体设为静态,打包完成后再恢复就能大幅度降低包体大小。(可使用代码写一个打包方法)
TMP_Settings.GetFontAsset().atlasPopulationMode = AtlasPopulationMode.Static;
BuidEditor.BuildAll();//伪代码
TMP_Settings.GetFontAsset().atlasPopulationMode = AtlasPopulationMode.Dynamic;
如果你发现构建后的项目包体大小仍然有些偏大,可以通过剔除未使用的字体并制作专属的字体集来进一步优化包体。这样可以显著减少包体大小,使其更加精致和完美。
四、扩展
图文嵌套排版
表情包支持
多语言支持(两种方式:官方多语言,扩展TextMeshPro)
待更新
总结
暂无