0. 引言
在Unity游戏开发中,处理中文文本时经常会遇到中文乱码、字体文件过大、内存占用高以及字体边缘模糊等问题。本文将介绍如何通过动态收集游戏中的实际使用字符,生成最小化的TextMeshPro字体资源,同时解决字体边缘模糊和灰边问题。

1. 步骤一:收集游戏使用的所有文本
1.1 方法A:手动整理
-
在项目中创建目录:`Assets/Text/`
-
创建 `chinese_text.txt` 文件
-
手动粘贴所有UI文本内容:(如下面的例子)
卡牌类型:辅助、攻击、防御、治疗、召唤、陷阱、魔法、装备
技能描述:造成152.75点伤害,附加流血效果
玩家名字:张三、李四、王五、赵六
系统提示:加载中... 保存成功! 网络断开
1.2 方法B:自动化提取
创建 `Assets/Editor/CollectText.cs` 编辑器脚本:
cs
//兼容 Unity 2020.3 ~ 2022.3
using UnityEngine;
using UnityEditor;
using TMPro;
using System.IO;
using System.Linq;
public class CollectText
{
[MenuItem("Tools/Collect All Chinese Text")]
static void Export()
{
// ✅ 兼容 Unity 2020.3 ~ 2022.3 的对象查找方式
var texts = Resources.FindObjectsOfTypeAll<TMP_Text>()
.Where(t => t.hideFlags == HideFlags.None) // 排除编辑器临时对象
.ToArray();
var sb = new System.Text.StringBuilder();
foreach (var t in texts)
{
// 跳过预制体(仅处理场景实例)
if (PrefabUtility.IsPartOfPrefabAsset(t))
continue;
string text = t.text;
if (string.IsNullOrEmpty(text)) continue;
foreach (char c in text)
{
// 收集:中文 + ASCII + 常用符号 + Emoji
if ((c >= 0x4E00 && c <= 0x9FFF) || // 基本汉字
(c >= 0x3400 && c <= 0x4DBF) || // 扩展A
(c >= 0x20 && c <= 0x7E) || // ASCII
(c >= 0x2000 && c <= 0x2BFF) || // 标点/符号
(c >= 0x1F600 && c <= 0x1F64F)) // Emoji
{
sb.Append(c);
}
}
}
string unique = new string(sb.ToString().Distinct().ToArray());
string path = "Assets/Fonts/chinese_text.txt";
Directory.CreateDirectory(Path.GetDirectoryName(path));
File.WriteAllText(path, unique);
AssetDatabase.Refresh();
Debug.Log($"✅ 已导出 {unique.Length} 个唯一字符到 {path}");
}
}
-
将脚本放入 `Assets/Editor/` 目录
-
在Unity编辑器菜单栏选择:`Tools > Collect All Chinese Text`
-
系统会自动扫描所有TMP Text组件并生成去重后的字符文件
2. 步骤二:生成优化的Font Asset
2.1 基本流程
-
打开 Font Asset Creator(Window > TextMeshPro > Font Asset Creator)
-
配置关键参数:
| 参数 | 推荐值 | 说明 |
|---|---|---|
| Font Source | LXGWWenKaiGB-Bold.ttf |
选择支持中文的字体文件 |
| Character Set | Custom Characters |
自定义字符集 |
| Characters | 加载生成的 chinese_text.txt |
仅包含实际使用的字符 |
| Atlas Resolution | 2048 或 4096 |
根据字符数量选择 |
| Padding | 5 |
避免灰边的关键参数 |
| Render Mode | Smooth |
平滑渲染模式 |
-
点击 Generate Font Atlas生成预览
-
确认无误后点击 Save 保存字体资源
2.2 优化技巧
-
Font Size (96): 提供足够的基础字形细节,即使UI中显示小字号,也从高质量源生成
-
Atlas Resolution (4096): 字符数量 < 2000,使用 `2048` 分辨率;字符数量 > 2000:使用 `4096` 分辨率
-
Sampling Point Size (100):提高采样精度,显著改善小字清晰度
-
Padding (5):避免相邻字符边缘干扰(关键参数), 值过大会导致"光晕"效果(灰边)
-
Render Mode (Smooth): 适合UI文本渲染,避免Hinted模式导致的边缘锯齿
总结
通过动态生成最小字体集的方法,可以显著优化Unity项目中中文文本的性能表现。关键点在于:
-
精确收集:只包含实际使用的字符
-
参数优化:特别是Padding=5解决灰边问题
-
高清设置:大尺寸采样确保清晰度
-
自动化流程**:减少人工维护成本