---------------------------------------------------------------------------------------------------------------------------------
前言
之前做一个系列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会把字体打进预制中形成冗余,体积增大的同时打包速度更是如蜗牛般缓慢。解决方法,参考网上解决方案:
方法为直接修改源码加载方式,下面简述其过程:
- 将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
- 修改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; } }
-
修改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"); }
-
打包测试一下,看来TMP_Settings只在Editor模式下加载,必须在运行时也添加相应的加载代码,否则会出现以下情况
-
加载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); } }
-
如果有ab框架,那么则需要在框架中提前加入这个固定的字体依赖或者排除冗余,然后再特定时机加载
-
完美解决
四、扩展优化
接下来我们打包ab时会非常迅速,但会出现包体过大的问题,本来几十k、几百k的文件打ab包后会增加数十倍。
- 原因之一是打包时使用了动态字体,那我们在打包时将字体设为静态,打包完成后再恢复就能大幅度降低包体大小。(可使用代码写一个打包方法)
- 如果你发现构建后的项目包体大小仍然有些偏大,可以通过剔除未使用的字体并制作专属的字体集来进一步优化包体。这样可以显著减少包体大小,使其更加精致和完美。
- 图文嵌套排版
- 表情包支持
- 多语言支持