【Unity基础】两个关于UGUI中Text对非英文字体支持的问题
问题1:Unity中为什么UGUI中的Text(Textmeshpro)默认不支持非英文字体,而legacy中的text却可以呢?
在Unity中,TextMeshPro(TMP)默认不支持非英文字体,而Legacy Text支持,主要原因如下:
1. 字体资源管理
- TextMeshPro:使用自定义字体资源(如
.fontasset
),需手动生成包含所需字符的字体资源。默认情况下,TMP仅包含英文字符以节省资源。 - Legacy Text:依赖系统字体,支持所有系统安装的字体,包括非英文字符。
2. 性能优化
- TextMeshPro:生成字体图集时,包含的字符越多,资源占用越大。默认仅包含英文字符以减少内存和存储开销。
- Legacy Text:直接使用系统字体,无需额外生成字体资源,因此支持所有字符。
3. 字符集生成
- TextMeshPro:需通过TMP的字体资产创建工具生成包含所需字符的字体资源。如果未生成包含非英文字符的字体资源,则无法显示。
- Legacy Text:直接使用系统字体,无需额外生成字符集。
4. 历史原因
- TextMeshPro:作为更现代的文本渲染方案,设计时更注重性能和灵活性,默认配置偏向英文用户。
- Legacy Text:作为旧版系统,设计时未过多考虑性能优化,因此支持更广泛的字符集。
解决方案
要让TextMeshPro支持非英文字体,需手动生成包含所需字符的字体资源:
- 在Unity中创建或导入字体文件(如TTF)。
- 使用TMP的字体资产创建工具生成包含非英文字符的字体资源。
- 在TextMeshPro组件中使用生成的字体资源。
总结
TextMeshPro默认不支持非英文字体是为了优化性能和资源管理,而Legacy Text直接使用系统字体,因此支持更广泛的字符集。通过手动生成字体资源,可以让TextMeshPro支持非英文字体。
问题2:UGUI中已经有了TextMeshPro为什么要还要保留Legacy中的这四个控件呢?
在Unity中,尽管TextMeshPro(TMP)提供了更强大的文本渲染功能,但Legacy UI系统中的四个控件(Text
、Image
、RawImage
、Button
)仍然被保留,主要原因如下:
1. 向后兼容性
- 历史项目:许多旧项目依赖Legacy UI系统,移除这些控件会导致项目无法正常运行。
- 平滑过渡:Unity希望开发者能够逐步迁移到TMP,而不是强制立即切换。
2. 简单场景的需求
- 轻量级需求:对于简单的UI需求(如仅显示英文文本或基本图像),Legacy控件足够使用,且更轻量。
- 快速开发:Legacy控件配置简单,适合快速原型开发或简单UI场景。
3. 性能考虑
- 低开销:Legacy控件在性能上比TMP更轻量,适合对性能要求较高的场景(如移动端或低端设备)。
- TMP开销:TMP功能强大,但生成字体资源和渲染复杂文本时开销较大。
4. 学习成本和迁移成本
- 学习曲线:TMP功能强大但配置复杂,新手可能更倾向于使用Legacy控件。
- 迁移成本:将Legacy控件替换为TMP需要额外工作(如生成字体资源、调整UI布局等),保留Legacy控件可以降低迁移成本。
5. 功能覆盖
- TMP并非万能:TMP主要用于文本渲染,而Legacy控件(如
Image
、RawImage
、Button
)在图像和交互功能上仍然有用。 - 混合使用:在某些场景中,开发者可能希望混合使用Legacy控件和TMP,以达到最佳效果。
6. Unity的渐进式改进策略
- Unity倾向于逐步改进其系统,而不是彻底废弃旧功能。保留Legacy控件是为了给开发者更多选择,同时逐步引导他们使用更现代的解决方案。
总结
保留Legacy控件的核心原因是为了向后兼容、简化开发流程、降低性能开销以及减少迁移成本。尽管TMP功能更强大,但Legacy控件在简单场景中仍然有其价值。Unity的目标是提供一个平滑的过渡路径,而不是强制开发者立即切换到TMP。