今日速览

  • Godot 4 的默认字体是 Open Sans SemiBold,不含任何中文字形,不加中文字体,你写的每一句中文都会变成方块(口口口)。
  • 字体要设在 Theme 的 Default Font 上,别一个 Label 一个 Label 去覆盖——将来加一句文案就要改十个地方。
  • Godot 4 起字号不属于字体,属于使用字体的节点(Theme Overrides > Font Sizes)。同一个字体可以配 5 种字号,不用复制 5 个字体资源。
  • 中文字体文件大(思源黑体单字重 10MB+),要么接受体积,要么子集化——但子集化会把「玩家自定义名字」变成方块,这是最常见的翻车点。
  • 像素风游戏必须用点阵字体并关掉抗锯齿/亚像素定位,字号取设计尺寸的整数倍,否则再好看的字也会糊成一团。

核心学习内容

1. 一劳永逸:把字体挂到 Theme 上

Godot 的字体设置有三个层级:Theme 编辑器、Control 节点的 Theme Overrides > Fonts、以及 Theme 资源的 Default Font。单人开发只该用第三种。

做法:

  1. 新建一个 theme/main_theme.tres(Theme 资源),在 Default Font 里加载你的中文字体,Default Font Size 设 16~18。
  2. 项目设置 > gui/theme/custom 指向这个 .tres,全项目所有 Control 自动继承。
  3. 需要强调的地方(标题、按钮)再用 FontVariation 派生:Base Font 指向同一份字体,只改字重/字距(spacing_glyph)/描边,不要另存一份字体文件。

这样以后换字体、调字距,只改一个 .tres,全游戏同步。

2. 字体选型与许可证(上架前必须过这一关)

免费可商用的稳妥选择:

  • 思源黑体 / Noto Sans SC(SIL OFL 1.1)——正文首选,字重齐全,简体覆盖完整。
  • 霞鹜文楷 LXGW WenKai(OFL)——有手写感,适合叙事/温暖向。
  • Zpix 最像素 / Fusion Pixel(OFL)——12px 点阵,像素游戏标配。

坑:OFL 要求分发时附带许可证文本。上架 Steam 时把 OFL.txt 放进游戏目录(或 Credits 页放个链接),别等审核或玩家举报才补。商业字体(方正、汉仪等)在游戏内嵌使用通常需要额外授权,别随手用。

3. FontFile 导入参数:三套配置,对症下药

Godot 4 里 .ttf 导入后是一个 FontFile 资源,关键选项:

场景AntialiasingHintingSubpixel PositioningMSDF
常规 UI 正文(16-24px)GrayscaleLightAuto关
需要在任意缩放下放大的 HUD/标题GrayscaleLightAuto开
点阵/像素字体NoneNoneDisabled关
  • MSDF 让字形在任意字号下都保持锐利,代价是内存更高、极小字号(<14px)反而发虚。只给标题和会缩放的 UI 用。
  • 像素字体必须关抗锯齿 + 关亚像素定位,并把字号设成设计尺寸(12px 字体就只用 12/24/36),否则玩家看到的是糊边。

体积问题:思源黑体 Regular + Bold 全量约 20MB。如果游戏只有几千字文案,用 pyftsubset 裁到几 MB 很划算:

pyftsubset SourceHanSansSC-Regular.otf \
  --text-file=all_text.txt \
  --output-file=font_subset.otf \
  --layout-features='*'

但:一旦有玩家自定义命名、随机生成词条、或者你后面加了新文案没重跑脚本,缺字就是方块。稳妥做法是:正文用子集化字体,同时把一份全量字体挂在 fallback 链的最后,缺字时自动回落。

4. 排版细节:让中文「读得下去」

  • 字号阶梯固定 5 级就够:12(辅助)/ 16(正文)/ 20(小标题)/ 28(标题)/ 48(大标题)。字号种类越多,字体纹理缓存越多,内存越高。
  • 行距:中文正文 line_spacing 取字号的 25%~40%,默认值偏挤。Label 的 theme_override_constants/line_spacing 直接调。
  • 自动换行:autowrap_mode = WORD_SMART,中英混排时它会优先在空格和 CJK 字符边界断行;ARBITRARY 会从英文单词中间劈开。
  • 中英混排 fallback:给英文字体(如 Inter)的 FontFile 添加 fallback 指向中文字体,比反过来好看——拉丁字符用西文字形,汉字自动回落。
  • 打字机效果:用 RichTextLabel.visible_characters 或 visible_ratio 递增,不要自己 substring 文本——substring 会把 BBCode 标签切断导致整段格式崩掉。
  • 分辨率适配:Steam Deck 是 1280×800,4K 桌面是 3840×2160,同一套字号在两端观感差一倍。用 canvas_items 拉伸模式 + 在 Deck 分辨率和 4K 下各截图对比一次,别只看编辑器。

🎯 DeepSeek 提示词

提示词 1:中文字体管线落地(搭建阶段用)

你是一名 Godot 4 的 UI/字体工程师。我要为一款中文 2D 游戏(像素风,目标平台 Windows + Steam Deck)搭建字体管线。

请输出一份可执行的实施方案,要求:
1. 给出 3 个候选字体(必须 SIL OFL 或等价可商用协议),标注:适用场景、单字重大致体积、许可证要求(是否需要随包分发 license 文件)。
2. 给出 .ttf 导入参数清单(Antialiasing / Hinting / Subpixel Positioning / Generate Mipmaps / MSDF 各自取值),并逐项解释为什么这么选。
3. 给出 Theme 资源的结构设计:Default Font、Default Font Size、哪些地方用 FontVariation 派生(字重/字距/描边),避免重复字体文件。
4. 给出「中文字体 + 西文字体」的 fallback 链配置顺序与理由。
5. 列出这套管线最容易翻车的 5 个点,每条给出一句话的验证方法。

输出格式:Markdown,分 5 个小节,参数用表格。不要泛泛而谈,每个取值都要能直接照着点。

提示词 2:字号阶梯与排版规范(做 UI 前用)

你是资深游戏 UI 设计师。我的游戏是中文 2D 像素游戏,UI 要在 1280×800(Steam Deck)到 3840×2160(4K)之间保持一致可读。

请给出一套排版规范,包含:
1. 字号阶梯表:5 个层级(辅助文字 / 正文 / 小标题 / 标题 / 大标题),给出字号、行距倍数、字色建议、使用场景。
2. Label / RichTextLabel 的 Godot 4 属性设置清单(autowrap_mode、line_spacing、以及需要 theme_override 的具体属性路径)。
3. 一段「对话框文本」的排版参数(每行最大字符数、行数上限、内边距、文字与立绘的安全距离)。
4. 在 1280×800 与 3840×2160 两端,哪些参数必须按比例缩放、哪些必须保持绝对值不变,并说明原因。

约束:不要建议用多个字体文件解决字号问题;所有字号必须来自同一字体资源。
输出:Markdown 表格 + 属性路径列表。

提示词 3:中文显示问题排查(出 bug 时用)

你是 Godot 4 的调试专家。我的游戏出现中文显示异常,请帮我定位。

现象:{描述现象,例如「部分对话显示为方块」「像素字体发虚」「打字机效果后富文本格式错乱」}

我的环境:
- Godot 版本:{4.x}
- 字体资源:{文件名 / 导入参数 / 是否 MSDF / 是否子集化}
- 出问题的节点:{Label 还是 RichTextLabel / 是否在 Theme 内}
- 相关代码:
```gdscript
{粘贴代码}
```

请按以下顺序分析并输出:
1. 最可能的 3 个原因,按概率排序,每个原因说明「为什么会导致这个现象」。
2. 每个原因对应的 1 行验证代码或检查步骤(能在 1 分钟内验证完的)。
3. 修复方案:给出具体的补丁(改哪个资源、改哪个属性、改成什么值),用 diff 或属性路径表达。
4. 如果涉及缺字,给出检测当前字体是否覆盖某字符串全部字形的 GDScript 片段。

约束:不要给 5 个并列猜测就结束,必须给出概率排序和最小验证步骤。

学习心得

中文字体是「一个人用 AI 做游戏」最容易忽略、又最容易被玩家第一眼看到的东西。玩家打开游戏,标题是方块,他不会觉得「这是个 bug」,他会觉得「这游戏没做完」——直接退款。

好消息是这件事一次性投入、长期受益:一个 Theme、一条 fallback 链、一张 5 级的字号表,之后所有 UI 都自动正确。而且这正好是 DeepSeek 擅长的活——它不需要理解你的玩法,只需要按规范产出参数表,你照着点十分钟就能搞定。

把「字体管线」写进你的项目第 1 天的 checklist,别留到发售前一周。

明日关注

  • 用 pyftsubset 把常用字体裁一份子集,对比全量版本的包体积差多少 MB。
  • 在 Steam Deck 分辨率(1280×800)下截一张对话界面,检查行距与字号是否还读得舒服。
  • 给游戏的 Credits 页加上字体许可证(OFL)声明,并确认安装目录里带上了 license 文件。

本文由自动化学习流水线每日生成,坚持即学即记。