Unity TextMeshPro 中文本地化:动态生成最小字体集(解决边缘模糊、乱码问题)

0. 引言

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

1. 步骤一:收集游戏使用的所有文本

1.1 方法A:手动整理

  1. 在项目中创建目录:`Assets/Text/`

  2. 创建 `chinese_text.txt` 文件

  3. 手动粘贴所有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}");
    }
}
  1. 将脚本放入 `Assets/Editor/` 目录

  2. 在Unity编辑器菜单栏选择:`Tools > Collect All Chinese Text`

  3. 系统会自动扫描所有TMP Text组件并生成去重后的字符文件

2. 步骤二:生成优化的Font Asset

2.1 基本流程

  1. 打开 Font Asset Creator(Window > TextMeshPro > Font Asset Creator)

  2. 配置关键参数:

参数 推荐值 说明
Font Source LXGWWenKaiGB-Bold.ttf 选择支持中文的字体文件
Character Set Custom Characters 自定义字符集
Characters 加载生成的 chinese_text.txt 仅包含实际使用的字符
Atlas Resolution 20484096 根据字符数量选择
Padding 5 避免灰边的关键参数
Render Mode Smooth 平滑渲染模式
  1. 点击 Generate Font Atlas生成预览

  2. 确认无误后点击 Save 保存字体资源

2.2 优化技巧

  1. Font Size (96): 提供足够的基础字形细节,即使UI中显示小字号,也从高质量源生成

  2. Atlas Resolution (4096): 字符数量 < 2000,使用 `2048` 分辨率;字符数量 > 2000:使用 `4096` 分辨率

  3. Sampling Point Size (100):提高采样精度,显著改善小字清晰度

  4. Padding (5):避免相邻字符边缘干扰(关键参数), 值过大会导致"光晕"效果(灰边)

  5. Render Mode (Smooth): 适合UI文本渲染,避免Hinted模式导致的边缘锯齿

总结

通过动态生成最小字体集的方法,可以显著优化Unity项目中中文文本的性能表现。关键点在于:

  1. 精确收集:只包含实际使用的字符

  2. 参数优化:特别是Padding=5解决灰边问题

  3. 高清设置:大尺寸采样确保清晰度

  4. 自动化流程**:减少人工维护成本

相关推荐
m0_630182462 小时前
Unity TMP 中文字体生成
unity·游戏引擎
weixin_409383122 小时前
godot y排序定位 sprite原点 等轴视角地图块测试 isometric 碰撞测试 初学godot
游戏引擎·godot
万兴丶3 小时前
Unity用C#完成抖音小游戏接入引力引擎(Gravity Engine)完整指南,一篇文章讲清楚!
unity·c#·游戏引擎·抖音
WarrenMondeville5 小时前
4.Unity面向对象-接口隔离原则
java·unity·接口隔离原则
WarrenMondeville7 小时前
3.Unity面向对象-里氏替换原则
unity·游戏引擎·里氏替换原则
WarrenMondeville8 小时前
5.Unity面向对象-依赖倒置原则
unity·设计模式·依赖倒置原则
万兴丶9 小时前
Unity 用AI自动开发游戏近一年----最新Cursor使用心得
人工智能·游戏·unity·cursor
张老师带你学20 小时前
UnityVR弯曲UI
科技·游戏·unity·游戏引擎·模型
张老师带你学1 天前
unity作业,街角小场景
科技·游戏·unity·游戏引擎·模型