Unity TextMeshPro中文使用与优化(繁/简)

---------------------------------------------------------------------------------------------------------------------------------

前言

之前做一个系列VR项目为了更好的显示效果用过,主要是展示在空气中的3DCanvas很舒服。

最近想用发现查起来不少文章说的不是很清晰(自己也忘了当初怎么做的),简短记录一下,希望看的人或着以后的自己能够10分钟解决这种安装问题


一、使用TextMeshPro优劣

优点:2021以后官方推荐使用,字体更为清晰,适合用到新的项目或VR中起到锦上添花的作用。

缺陷:有学习成本,适配其他的方式和以往有区别,手机端有一定消耗(使用中文的情况下)。

建议PC端使用,且备一套自己的字体文本方便随时生成修改生僻字等。

二、使用步骤

1.创建中文字体集

准备自己需要的字体、中文常用字的txt、生僻字txt、符号txt,目前更新了常用繁/简体;如下:

链接:https://pan.baidu.com/s/1rJOSlw9yweoBp3T3BdLxWg?pwd=4xh1 
提取码:4xh1

打开Window/TextMeshPro/Font Asset Creator(如果没安装此时会提示安装)

把txt拖入,如图进行创建字体,这里的参数仅供参考,按照项目的需求来即可。

完成后记得save as到该目录下。

2.生成动态字体

我们把生成的字体拖入文本等组件,发现边缘模糊,是因为没有使用动态字体。

右键我们字体Alibaba-PuHuiTi-Regular(最开始导入的阿里巴巴那个),Create/TextMeshPro/Font Asset;

或者选中字体使用快捷键Ctrl+Shift+F12可以快速生成动态字体Alibaba-PuHuiTi-Regular SDF 1,将其改名为Alibaba-PuHuiTi-Regular SDF Dynamic,这时候拖入发现字体很清晰了。

3.外挂其他字体

点击生成的主字体,如图中右边对应位置添加即可。(可同时外挂简体、繁体等字体,也可以使用该机制做本地化切换,需要的自行搜索)

4、设置默认字体

 三、优化

游戏开发阶段通常使用Fast打包方式,在正式项目发布的时候需要切换一下打包方式,重写将字体打包,会获得更好的性能。(注:打包时间长达30分钟以上,想要精度更高选择SDF8等渲染模式将会更慢)

打ab包时,预制体使用TMP会把字体打进预制中形成冗余,体积增大的同时打包速度更是如蜗牛般缓慢。解决方法,参考网上解决方案:

http://t.csdnimg.cn/3yLlC

方法为直接修改源码加载方式,下面简述其过程:

  1. 将TMP插件下的 Resources 文件夹改名为TMPPro,将字体、txt文本移动至Fonts文件夹
  2. 将TMP的包com.unity.textmeshpro从Library下移动至Packages并将文件和子文件取消只读勾选(项目不需要上传git平台忽略此步)
  3. 找到Packages\com.unity.textmeshpro\Scripts\Runtime\TMP_Setting.cs和Packages\com.unity.textmeshpro\Scripts\Editor\TMP_SettingsEditor.cs
  4. 修改TMP_Setting.cs
            public static TMP_Settings instance
            {
                get
                {
                    if (s_Instance == null)
                    {
                        //s_Instance = Resources.Load<TMP_Settings>("TMP Settings");
    
    #if UNITY_EDITOR
                        s_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 project
                        if (s_Instance == null && Time.frameCount != 0)
                        {
                            // Open TMP Resources Importer
                            TMP_PackageResourceImporterWindow.ShowPackageImporterWindow();
                        }
    #endif
                    }
    
                    return s_Instance;
                }
                set { TMP_Settings.s_Instance = value; }
            }
  5. 修改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");
      }
  6. 打包测试一下,看来TMP_Settings只在Editor模式下加载,必须在运行时也添加相应的加载代码,否则会出现以下情况

  7. 加载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);
     }
    
    }
  8. 如果有ab框架,那么则需要在框架中提前加入这个固定的字体依赖或者排除冗余,然后再特定时机加载

  9. 完美解决

 四、扩展优化

        接下来我们打包ab时会非常迅速,但会出现包体过大的问题,本来几十k、几百k的文件打ab包后会增加数十倍。

  • 原因之一是打包时使用了动态字体,那我们在打包时将字体设为静态,打包完成后再恢复就能大幅度降低包体大小。(可使用代码写一个打包方法)
  • 如果你发现构建后的项目包体大小仍然有些偏大,可以通过剔除未使用的字体并制作专属的字体集来进一步优化包体。这样可以显著减少包体大小,使其更加精致和完美。
  • 图文嵌套排版
  • 表情包支持
  • 多语言支持

  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值