当前位置: 首页 > news >正文

Unity UI的未来之路:从UGUI到UI Toolkit的架构演进与特性剖析(6)

第六章:TextMesh Pro与UI Toolkit字体系统全解

在构建了UI的布局和样式之后,我们现在必须关注其最终表达——文本与字体。清晰、美观、高性能的文本渲染,是决定UI最终品质和用户体验的关键一环。在Unity中,UGUI和UI Toolkit虽然都致力于提供顶级的文本效果,但它们底层的技术、资产类型和工作流却存在着微妙而重要的差异。

本章将深入探索Unity的现代字体系统,理解其核心的SDF渲染技术,并详细对比TextMesh Pro (UGUI) 和 TextCore (UI Toolkit) 在字体资产创建、高级功能应用和工作流上的异同。

1. 核心技术:SDF字体渲染与两大系统

截至Unity 2021 LTS,UGUI和UI Toolkit都采用了基于SDF(Signed Distance Field,有向距离场)的先进字体渲染技术。SDF技术通过将字形(Glyph)信息存储为距离场纹理,使得字体即使在被大幅缩放或变换时,依然能保持极其清晰锐利的边缘,远优于传统的位图字体。

  • 两大底层系统
    • UGUI: 其文本系统由TextMesh Pro (TMP) 提供支持。
    • UI Toolkit: 其文本系统由TextCore 提供支持,而TextCore本身就是基于TextMesh Pro技术演化而来的。
  • 当前的“分治”状态
    尽管两者技术同源,且Unity计划在未来统一字体系统,但在当前版本中,它们依然使用各自独立的字体资产类型。这意味着,为TextMesh Pro创建的字体资产,不能直接用于UI Toolkit,反之亦然。为两个系统分别创建字体资产,是目前必须遵循的最佳实践。

2. 字体资产的工作流

在Unity中使用自定义字体,需要经历一个从“源文件”到“字体资产”的转换过程。

  • 第一步:导入源字体文件 (TTF/OTF)
    将.ttf或.otf格式的字体文件导入到Unity项目中。为了保证后续功能的正常使用,建议在导入设置中将Character设置为Dynamic,并勾选Include Font Data。
  • 导入设置
  • 第二步:创建字体资产 (
    Font Asset)

    选中导入的源字体文件,通过Assets > Create菜单,可以为其生成对应的字体资产。
    • 为UGUI创建:选择TextMeshPro > Font Asset。
    • 为UI Toolkit创建:选择Text > Font Asset。
      生成的字体资产在Project窗口中会有不同的图标,以示区分。

不同字体资源

  • 第三步:配置字体资产 (Static vs. Dynamic)
    选中新生成的字体资产,在Inspector的Generation Settings中,最重要的配置是Atlas Population Mode,它决定了字体资产的类型:
  1. Static (静态):这是推荐的、性能更优的选项。它会在生成资产时,将指定的字符集预烘焙(pre-bake)成一张字体图集纹理(Font Atlas Texture)
  • 工作流:通过点击Update Atlas Texture打开Font Asset Creator窗口,可以精确地指定图集的分辨率、内边距(Padding),以及需要包含的字符集(如仅ASCII、自定义字符列表等)。这对于优化资源非常有用,因为你只需为游戏中实际用到的字符生成纹理。
  • SDF的Padding:在SDF字体中,Padding至关重要。它为字形边缘的距离场渐变提供了空间,Padding越大,字体边缘的渲染质量越高,也越能支持更粗的轮廓等特效。
  • Dynamic (动态):此模式不会预烘焙图集。相反,它会在运行时,当某个字符首次被使用时,动态地将其添加到图集纹理中。
  • 优缺点:动态模式更灵活,无需预先指定字符集。但它的运行时开销更大,并且要求源字体文件必须被包含在最终的游戏构建包中,这会增加包体大小。

3. 高级文本特性

两大系统都支持一系列强大的高级文本功能,使得复杂的文本排版和样式化成为可能。

  • 富文本 (Rich Text)
    通过在文本字符串中插入类似HTML的标签,可以对局部文本的样式进行修改。
    • 启用方式:在UGUI的TextMeshPro组件的Extra Settings中,或在UI Toolkit的Visual Element的Text属性中,勾选Enable Rich Text。
    • 常用标签:<b> (加粗), <i> (斜体), <color=#FF0000> (颜色), <size=50%> (尺寸), <align=right> (对齐), <sprite index=0> (插入精灵) 等。
    • 应用场景:非常适合用于对话系统、需要高亮关键词的教程文本、或在用户名中嵌入特殊图标等。

在 UI Builder 中启用富文本标签,使标签能够修改文本的视觉属性。

  • 文本样式表 (Text Style Sheets)
    为了避免在大量文本中手动重复编写复杂的富文本标签,可以使用文本样式表来创建可复用的自定义文本样式。
    • 工作原理:在样式表中定义一个样式(如title),并为其指定一套完整的富文本标签(如<color=yellow><b><size=120%>)。之后,在文本中只需使用一个简单的<style=title>标签,即可应用这套复杂的样式。
    • 资产位置
      • UGUI中,Style Sheet资产需要被关联到TextMeshPro组件的Extra Settings下。
      • UI Toolkit中,Text Style Sheet资产则需要被关联到UI的Panel Settings所引用的Text Settings资产中。一个可复用的文本样式表示例
      • 优势:极大地简化了复杂文本格式的管理,提升了可维护性,并减少了出错的可能。
      • 字体资产变体 (Font Asset Variant)
        如果你想基于一个已有的字体资产,创建一种只有少量参数(如行高、字重、下划线位置等)不同的变体,而不想重新生成一张完整的、占用额外内存的字体图集,那么可以使用Font Asset Variant。它会共享原始字体资产的图集纹理,但允许你覆盖其Face Info中的各种度量参数。

4. 图文混排:精灵资产 (Sprite AssetSprite Asset)

两大系统都支持通过富文本标签,在文本字符串中无缝地嵌入精灵图片(如表情符号Emoji、道具图标等)。

  • 工作流
  1. 准备图集:将所有需要用作文本精灵的图片,导入Unity并打包成一张Sprite Atlas
  2. 切片:在Sprite Editor中,将这张图集精确地切割成多个独立的Sprite。
  3. 创建精灵资产:选中切割好的Sprite Atlas文件,通过Assets > Create菜单,为其生成对应的Sprite Asset(同样,UGUI和UI Toolkit需要创建各自类型的资产)。
  4. 关联资产:与文本样式表类似,将生成的Sprite Asset关联到UGUI的TextMeshPro组件或UI Toolkit的Text Settings中。
  5. 在文本中使用:通过<sprite index=0>或<sprite name="emoji_smile">这样的富文本标签,即可在文本中插入对应的精灵。

5. UGUI专属特性:颜色渐变 (Color Gradient)

目前,TextMesh Pro (UGUI) 提供了一个UI Toolkit尚未支持的独特功能:颜色渐变。它允许为文本的每个字符,应用最多四种颜色的顶点色渐变,从而创造出华丽的彩虹字、火焰字等效果,而无需任何自定义Shader。

总结:

通过对Unity现代字体系统的深入探索,我们看到了一套功能强大、技术先进,但目前仍处于“分裂”状态的解决方案。无论是UGUI的TextMesh Pro,还是UI Toolkit的TextCore,它们都以SDF渲染技术为基石,为开发者提供了创造清晰、美观、富有表现力的文本体验所需的全套工具。

理解静态与动态字体资产的性能权衡,熟练运用富文本、文本样式表和精灵资产来丰富文本内容,是每一个追求高品质UI的开发者都必须掌握的技能。尽管目前两大系统资产不通用的现状带来了一些额外的工作量,但这也迫使我们更清晰地去规划项目的字体资源管理策略。随着Unity对字体系统统一的持续推进,我们有理由相信,未来的文本创作工作流将变得更加无缝和高效。

http://www.dtcms.com/a/307585.html

相关文章:

  • 【笔记】重学单片机(51)
  • Mac上优雅简单地使用Git:从入门到高效工作流
  • threejs创建自定义多段柱
  • 浅谈物联网嵌入式程序开发源码技术方案
  • STORM代码阅读笔记
  • 邢台市某区人民医院智慧康养平台建设项目案例研究
  • Mac安装Navicat教程Navicat Premium for Mac v17.1.9 Mac安装navicat【亲测】
  • 【ARM】PK51关于内存模式的解析与选择
  • c++:设计模式训练
  • 两款免费数据恢复软件介绍,Win/Mac均可用
  • 【javascript】new.target 学习笔记
  • 揭秘动态测试:软件质量的实战防线
  • List和 ObservableCollection 的区别
  • 【worklist】worklist的hl7、dicom是什么关系
  • 原生安卓与flutter混编的实现
  • 如何使用一台电脑adb调试多个Android设备
  • AI 如何评价股票:三七互娱(SZ:002555),巨人网络(SZ:002558)
  • 解决:MATLAB 已经画好了Figure,想在不重新绘图的情况下去掉坐标轴刻度线
  • Java 大视界 -- Java 大数据在智能医疗远程健康监测与疾病预防预警中的应用(374)
  • 《以终为始,不辩过程》
  • cartographer 概率栅格地图
  • JVM面试通关指南:内存区域、类加载器、双亲委派与GC算法全解析
  • 一万字讲解Java中的IO流——包含底层原理
  • GCC/G++ + Makefile/make 使用
  • Visual Studio调试技巧与函数递归详解
  • “0 成本开跨境店” 噱头下的优哩哩:商业模式深度剖析
  • 5G 单兵终端 + 无人机:消防应急场景的 “空 - 地” 救援协同体系
  • 【可用有效】Axure RP 9 授权码
  • imx6ull-驱动开发篇5——新字符设备驱动实验
  • springcloud04——网关gateway、熔断器 sentinel