Attention: Here be dragons

This is the latest (unstable) version of this documentation, which may document features not available in or compatible with released stable versions of Godot.

使用字体

Godot 中能够为不同的 UI 节点设置指定的字体。

有三种不同的地方都可以设置字体。第一个地方是主题编辑器,选择要设置字体的节点后选择字体选项卡即可。第二个地方是控件节点的检查器,在 Theme Overrides > Fonts 中设置。最后是主题的检查器,在 Default Font 中设置。

如果其他地方都没有指定字体覆盖项,那么就会使用 Open Sans SemiBold 作为默认的项目字体。

备注

从 Godot 4.0 开始,字体的大小不再随字体本身指定,而是在使用字体的节点中定义。可以在检查器的 Theme Overrides > Font Sizes 中找到。

这样修改字体大小的时候就不必为每种字体大小复制字体一份资源了。

字体文件有两种:动态字体(TTF/OTF/WOFF/WOFF2 格式)和位图字体(BMFont .fnt 格式或等宽图像)。动态字体是最常用的,因为可以调整字体大小,即便很大也能保持清晰。与位图字体相比,动态字体由于基于向量,所以可以在包含更多字形的同时保持合理的文件大小。动态字体还支持位图字体无法支持的一些高级功能,例如合字(将若干字符转换为专门设计的单一字符)。

小技巧

你可以在 Google FontsFont Library等网站找到免费授权的字体文件。

字体是受版权保护的。使用前请仔细检查字体的许可证,因为并非所有字体都允许在不购买许可证的情况下用于商业用途。

参见

你可以使用 BiDI 和字体特性演示项目在实践中了解字体的工作原理。

动态字体

Godot 支持以下动态字体格式:

  • TrueType 字体或合集(.ttf.ttc

  • OpenType 字体或合集(.otf.otc

  • Web 开放字体格式 1(.woff

  • Web 开放字体格式 2( .woff2

虽然 .woff 尤其是 .woff2 的文件往往更小,但并不存在普遍“更好”的字体格式。大多数情况下建议使用字体开发者网站上提供的字体格式。

位图字体

Godot 支持 BMFont(.fnt)位图字体格式。这种格式是由 BMFont 程序创造的。与 BMFont 兼容的程序也有很多,比如 BMGlyph 和 Web 版的 fontcutter

“另外,你也可以导入任意图片来当作位图字体使用。具体做法是:先在‘文件系统’(FileSystem)面板中选中这张图片,然后切换到‘导入’(Import)面板,将它的导入类型更改为 字体数据(图片字体),最后点击 重新导入(Reimport) 即可:

将导入类型更改为 字体数据(图片字体)

将导入类型更改为 字体数据(图片字体)

字体可以使用任意顺序的字符集布局,但建议使用与标准 Unicode 一致的顺序,这样导入所需的配置就会少很多。例如,下面的位图字体包含了 ASCII 字符,与标准 ASCII 顺序一致:

位图字体示例

Credit: LibreQuake (经过缩放和裁剪,以排除扩展范围)

使用以下导入选项即可成功导入上述字体图像:

上面的示例字体使用的导入选项

上面的示例字体使用的导入选项

字符范围选项是一个数组,对应图像上的各个位置(单位为图块坐标,并非像素)。字体图集的遍历顺序是从左到右、从上到下。字符的指定方式可以是十进制数组(127)、十六进制数字(0x007f)或使用西文引号包围('~')。可以用西文横杠指定字符之间的范围。

例如 0-127(或 0x0000-0x007f)指定的就是整个 ASCII 的范围。再比如 ' '-'~' 就等价于 32-127,代表可打印(可见)的 ASCII 字符范围。

请确保字符范围不超过列数 × 行数所定义的数量。否则导入字体会失败。

如果字体图像中包含未用于字体字形的边距(如署名信息),请尝试调整图像边距。该边距只会在完整图像周围应用一次。

如果字体图像中包含辅助线(画在字形之间)或者字符间距看上去有问题,请尝试调整字符边距。每个导入的字形都会应用该边距。

若需比 字符边距 选项更精细的字符间距控制,你还有更多选择。

首先,字符范围(Character Ranges) 支持在指定字符范围后,额外添加 3 个参数。这些额外的参数用于控制字符的定位和间距,它们依次代表:步进空间(space advance)、X轴偏移和Y轴偏移。这些参数会按照你输入的像素数值,改变每个字符的步进空间和偏移量。举个例子,如果你的小写字母比大写字母更细,那么调整步进空间就会非常有用。

示意图:展示在字符范围(character ranges)中是如何使用 advance(步进/推进)和 offset(偏移)数值的。

请注意,设置偏移量可能会导致你的文字超出 Label(标签)的边界,从而被裁剪掉一部分。

其次,你还可以为单独的字符设置字间距配对(Kerning Pairs)。设置方法很简单:输入两组字符,中间用一个空格隔开,然后再加一个空格,最后输入一个数字。这个数字就代表了当这两组字符紧挨着放在一起时,需要额外增加(或减少)多少像素的间距。

../../_images/using_fonts_bitmap_kerning_pairs_example.webp

如果需要的话,你可以通过输入 \uXXXX 的形式,使用 Unicode 字符代码来指定你的字间距配对字符,其中 XXXX 代表该 Unicode 字符的十六进制数值。

加载字体文件

要加载字体文件(动态字体或位图字体),请使用字体属性旁资源下拉菜单中的快速加载加载选项,然后找到要使用的字体文件:

../../_images/using_fonts_load_font.webp

加载字体文件

你也可以将“文件系统”面板中的字体文件拖放至检查器中接受 Font 资源的属性。

警告

从 Godot 4.0 版本开始,纹理的过滤和重复属性由使用纹理的地方定义,不再由纹理自身定义,字体亦然(动态字体和位图字体都是这样)。

像素风格的字体应当禁用双线性过滤,做法是将项目设置 渲染 > 纹理 > 画布纹理 > 默认纹理过滤 改为 Nearest

这种字体的大小必须是设计大小的整数倍(设计大小因字体而异),使用该字体的 Control 节点也必须采用整数倍缩放,否则字体看上去就会很模糊。Godot 中的字体大小使用像素(px)为单位,不使用点(pt)为单位。在不同软件之间比对字体大小时请务必注意这一点。

继承自 CanvasItem 的节点也可以单独设置纹理过滤模式,使用 CanvasItem.texture_filter 即可。

字体轮廓与阴影

如果无法提前预知背景色,那么使用字体轮廓和阴影就可以提升可读性。例如在 2D/3D 场景上绘制 HUD 元素时就是这样的情况。

大多数继承自 Control 的节点以及 Label3D 节点都可以使用字体轮廓功能。

在节点上启用字体轮廓的方法是在检查器中配置主题覆盖项 Font Outline ColorOutline Size。结果应该类似这样:

字体轮廓示例

字体轮廓示例

备注

如果使用支持 MSDF 渲染的字体,其导入选项中的 MSDF Pixel Range(MSDF 像素范围) 必须至少设置为描边大小(outline size)的 两倍 ,这样渲染出来的描边效果才会正常。否则,描边可能会在还没达到预期宽度时,就提前被截断或消失了。

字体阴影的支持相对受限:目前只有在 LabelRichTextLabel 这两个节点中才能使用。此外,字体阴影的边缘总是硬边的(不过,你可以通过降低阴影的不透明度,让它的视觉效果看起来更柔和、不那么突兀)。要在指定的节点上启用字体阴影,你需要在 Label 或 RichTextLabel 节点中,相应地配置以下主题覆盖(theme overrides)属性:Font Shadow Color(字体阴影颜色)Shadow Offset X(阴影X轴偏移) 以及 Shadow Offset Y(阴影Y轴偏移)

在 Label 节点中配置字体阴影

在 Label 节点中配置字体阴影

结果应如下所示:

字体阴影示例

字体阴影示例

小技巧

你可以通过创建一个 LabelSettings 资源,并在多个 Label 节点之间重复使用它,来为 Label 节点的字体显示创建局部覆盖(local overrides)。这个资源的优先级会高于 theme properties

高级字体特性

抗锯齿

你可以通过调整 抗锯齿(antialiasing)微调(hinting) 来控制字体在渲染时应该如何被平滑处理。它们是两个不同的属性,各自有着不同的适用场景。

抗锯齿(Antialiasing)控制着字体在光栅化(也就是渲染成位图)时,字形的边缘应该如何被平滑处理。默认的抗锯齿方式(Grayscale / 灰度)在任何显示技术上都能有良好的表现。不过,在字体尺寸较小的时候,灰度抗锯齿可能会让文字看起来有些模糊。

通过使用 LCD 子像素优化,可以提升抗锯齿的锐利度。它的原理是:根据大多数 LCD 显示器的子像素排列规律,在红、绿、蓝(RGB)各个颜色通道上分别对字体的抗锯齿进行微调偏移。不过它的缺点也很明显,就是在文字边缘可能会产生 "色边(fringing)" 现象,尤其是在那些没有采用标准 RGB 子像素排列的显示技术上(比如 OLED 显示屏),这种色边会更加明显。

在大多数游戏中,建议直接使用默认的 Grayscale(灰度) 抗锯齿。而对于非游戏类的应用程序,则值得尝试探索一下 LCD 子像素优化。

字体抗锯齿对比

从上到下依次为:禁用(Disabled)、灰度(Grayscale)、LCD 子像素(RGB)

备注

MSDF 渲染的字体无法修改抗锯齿——这种字体始终使用灰度抗锯齿进行渲染。

微调

微调控制的是对字体进行栅格化的时候,字形边缘吸附到像素的程度。None看上去最平滑,字体较小时会看上去比较模糊。Light(默认值)只会在 Y 轴上对字形的边缘进行吸附,看上去会比较锐利,而 Full 则更加锐利,X 轴和 Y 轴都会进行边缘的吸附。对微调模式的选择取决于你个人的口味。

字体微调对比

从上到下依次为:无(None)、轻度(Light)、完全微调(Full hinting)

备注

如果在点击 Reimport(重新导入) 后,更改微调模式依然没有任何视觉效果,通常是因为该字体文件本身没有包含微调指令。解决这个问题的方法有两种:一是去寻找一个自带微调指令的字体文件版本;二是在导入面板(Import dock)中勾选 Force Autohinter(强制自动微调) 。勾选后,Godot 会调用 FreeType 的自动微调器,自动为导入的字体添加微调指令。

次像素定位

亚像素定位(subpixel positioning)是可以调整的。这是一项 FreeType 引擎提供的特性,它能让字形(glyphs)的渲染效果更贴近其原本应有的形态。默认设置 Auto(自动) 会在字体尺寸较小时自动启用亚像素定位,而在字体尺寸较大时将其关闭,以此来提升光栅化的处理性能。

你可以强制将亚像素定位(subpixel positioning)模式设置为 Disabled(禁用)One half of a pixel(半个像素)One quarter of a pixel(四分之一个像素) 。其中,One quarter of a pixel(四分之一个像素) 能提供最佳的渲染质量,不过代价是会增加光栅化的处理时间。

更改抗锯齿(antialiasing)、微调(hinting)和亚像素定位(subpixel positioning)的设置,在较小的字体尺寸下,视觉效果最为明显。

警告

带有像素画外观的字体,应该将其亚像素定位(subpixel positioning)模式设置为 Disabled(禁用) 。否则,字体可能会出现像素大小不均匀的情况。

这一步对于位图字体来说并不是必须的,因为亚像素定位(subpixel positioning)只与动态字体(通常由矢量元素构成)有关。

Mipmap

默认情况下字体不会生成 Mipmap,这样就能够降低内存占用、加速栅格化。但这样一来,缩小后的字体就会变成一坨。3D 文本 不启用 Fixed Size 的时候尤为明显。如果在 Control 节点中使用传统的栅格化字体(非 MSDF 字体)显示文本,并且该节点的缩放比 (1, 1) 要小,也会出现这种情况。

在“文件系统”面板中选中字体后,你可以在“导入”面板中启用 Mipmap,从而改善字体缩小渲染后的外观。

MSDF 字体也可以启用 Mipmap。在字体大小小于默认值时,这可以稍稍改善字体的渲染质量,但 MSDF 字体在放大后原本就是没有颗粒度问题的。

MSDF 字体渲染

多通道带符号距离场(Multi-channel signed distance field,MSDF)字体渲染能够将字体渲染为任意大小,无需在大小发生变化时重新栅格化。

与 Godot 默认使用的传统字体栅格化相比,MSDF 字体渲染有两个优点:

  • 即便文字非常巨大,字体看上去也总是清晰的。

  • 首次渲染大字号字体的字符时卡顿更短,因为无须执行栅格化。

MSDF 字体渲染的缺点有:

  • 字体渲染的基础开销较高。桌面平台上通常无法察觉,但是会影响低端移动设备。

  • 由于缺少微调,较小的字体没有栅格化字体清晰。

  • 与传统的栅格化字体相比,首次为新字形渲染小字号字体的开销可能更大。可以使用 字体预渲染 缓解。

  • 无法为 MSDF 字体启用 LCD 次像素优化。

  • MSDF 模式下无法正确渲染轮廓自相交的字体。如果使用从 Google Fonts 等处下载到的字体时出现渲染问题,请尝试改为从作者的官方网站下载。

字体栅格化方法比较

字体栅格化方法比较。从上到下依次为:无过采样光栅化、带过采样光栅化、MSDF

要启用某个字体的 MSDF 渲染,请在“文件系统”面板中选中,然后在“导入”面板中启用多通道带符号距离场,然后点击重新导入

在字体的导入选项中启用 MSDF

在字体的导入选项中启用 MSDF

使用 Emoji

Godot 对 Emoji 字体的支持有限:

  • 支持 CBDT/CBLC(内嵌 PNG)和 SVG Emoji 字体。

  • 不支持 COLR/CPAL Emoji 字体(自定义矢量格式)。

  • 不支持 EMJC 位图压缩(iOS 系统 Emoji 字体需要用到)。这意味着如果要在 iOS 上支持 Emoji,你就必须改用自定义的使用 SVG 或 PNG 位图压缩的字体。

想要 Godot 正常显示 Emoji,你所使用的字体(或者它的某个 fallbacks )必须包含这些 Emoji 字形。否则,Emoji 就无法显示,取而代之的会是占位的 "豆腐块" 字符(tofu characters):

尝试在标签中使用 Emoji 的默认外观

尝试在标签中使用 Emoji 的默认外观

在添加了用于显示 Emoji 的字体(例如 Noto Color Emoji)之后,你就能得到预期的显示效果了:

为标签添加 Emoji 字体后的正确外观

为标签添加 Emoji 字体后的正确外观

如果想在使用常规字体的同时显示 Emoji,建议在常规字体的高级导入设置中,指定一个指向 Emoji 字体的 fallback font 。如果你希望在显示 Emoji 的同时依然使用项目默认的字体,只需在 FontVariation(字体变体)中将 Base Font(基础字体) 属性留空,然后添加一个指向 Emoji 字体的回退字体即可:

小技巧

Emoji 字体(表情符号字体)的体积通常非常大,所以你可能更倾向于 load a system font 来获取 Emoji 字形,而不是直接把它打包进你的项目里。这样做的好处是,可以在不增加最终导出的 PCK 文件体积的前提下,让你的项目完美支持 Emoji。不过缺点也很明显:不同平台下的 Emoji 长相会不一样(比如在 Windows 和 macOS 上显示的表情样式不同),而且并不是所有的平台都支持加载系统字体。

也可以将系统字体用作回退字体。

使用图标字体

Fontello 这样的工具,可以用来生成包含从 SVG 文件导入的矢量图形的字体文件。这样一来,你就可以把自定义的矢量元素当作普通文字一样进行渲染,或者配合 3D 文本 (3D 文本教程)和 TextMesh(文本网格),制作出带有挤出效果的 3D 图标。

备注

Fontello 目前还不支持创建多色字体(尽管 Godot 本身是可以渲染多色字体的)。截至 2022 年 11 月,各类图标字体生成工具对多色字体的支持依然非常少见。

根据你的具体使用需求,这种做法(指使用图标字体)相比在 RichTextLabel 中直接使用 img 标签,可能会带来更好的效果。因为真正的矢量数据(vector data)可以被缩放到任意尺寸而不会损失画质,这与位图图像(bitmap images)不同——就连 SVG 图像在导入 Godot 时也会被默认光栅化处理。

下载生成好的字体文件后,把它加载到你的 Godot 项目中,然后将其指定为 Label、RichTextLabel 或 Label3D 节点的自定义字体。接着切换回 Fontello 的网页界面,选中你想要的字符,按下 Ctrl + C (macOS 上是 Cmd + C )来复制它。最后,把这个字符粘贴到你 Label 节点的 Text 属性里。虽然在编辑器检查器(inspector)里,这个字符可能会显示成一个占位符(也就是那种方框或问号),但它在 2D 或 3D 视口中是会正常显示的,不用担心。

如果想在同一个控件(Control)中同时使用图标字体和传统字体,你可以将图标字体指定为一种 fallback 。之所以能这样操作,是因为图标字体使用的是 Unicode 中的私有使用区( private use area )。这个区域是专门预留给自定义字体使用的,在设计上原本就不会包含任何标准的文字字形。

备注

许多现代图标字体(例如 Font Awesome 6 )都提供了桌面版本,它们利用 连字(ligatures) 功能来指定图标。这意味着,你可以直接在任何支持显示字体的节点的 Text (文本)属性中,输入图标的名称来调用它。一旦你完整输入了图标的名称(比如输入 house ),文本就会自动被替换成对应的图标。

虽然这种方法用起来更简单,但它无法与字体回退(font fallbacks)搭配使用,因为主字体的字符会优先于回退字体的连字(ligatures)。

字体回退

Godot 支持定义一个或更多的回退字体,会在主字体缺失要显示的字形时使用。定义回退字体主要有两种用途:

  • 使用仅支持拉丁字符集的字体,需要显示西里尔字母等其他字符集的文本时使用另一种字体。

  • 使用一种字体渲染文本,使用另一种字体渲染 emoji 和图标。

在文件系统(FileSystem)面板中双击字体文件,即可打开‘高级导入设置(Advanced Import Settings)’对话框。你也可以在文件系统面板中先选中该字体,然后切换到‘导入(Import)’面板,再点击底部的 Advanced… 按钮:

../../_images/using_fonts_advanced_import_settings.webp

导入面板

在出现的对话框中,找到右侧的 回退 部分,点击 Array[Font](大小 0)字样展开属性,然后点击添加元素

../../_images/using_fonts_font_fallbacks_add.webp

添加字体回退

点击新元素上的下拉箭头,然后使用快速加载加载选项选择字体文件:

../../_images/using_fonts_font_fallbacks_load.webp

加载字体回退

使用默认项目字体时也可以添加回退字体,做法是将 Base Font 留空,同时添加一个或多个字体回退。

备注

字体回退也可以单独定义,做法和 OpenType 字体特性 类似,这里不再赘述。

可变字体

Godot 提供了对可变字体的完整支持,可变字体能够用单个字体文件表示不同的字重和样式(常规、加粗、斜体等)。该功能需要字体文件本身支持可变字体。

使用可变字体时,请在需要使用字体的地方创建 FontVariation 资源,然后在该 FontVariation 资源中加载字体文件:

../../_images/using_fonts_font_variation_create.webp

创建 FontVariation 资源

../../_images/using_fonts_font_variation_load.webp

为 FontVariation 资源加载字体文件

向下滚动到 FontVariant 的 Variation 部分,然后点击 变体坐标 字样展开可调节轴的列表:

../../_images/using_fonts_font_variation_variable_font.webp

可变轴列表

能够调整哪些轴取决于加载的字体。有些可变字体仅支持单轴调整(通常是字重倾斜),有些可变字体则会支持多轴调整。

例如,Inter V 字体将字重设置为 900倾斜设置为 -10 时是这样的:

../../_images/using_fonts_font_variation_variable_font_example.webp

可变字体示例(Inter V)

小技巧

虽然可变字体的轴名称和刻度并没有完全统一的标准,但字体设计师们通常会遵循一些通用的惯例。其中,字重(weight) 轴在 OpenType 规范中是标准化的,其具体对应规则如下:

轴值

实际字体粗细

100

细(极细线)

200

特细(超细)

300

细体/亮的(Light)

400

常规(普通)

500

中等

600

半粗体(中粗体)

700

粗体

800

特粗体(超粗体)

900

黑体(重体)

950

特黑体(超黑体)

你可以将 FontVariation 保存为 .tres 资源文件,这样就能够在其他地方重复使用了:

../../_images/using_fonts_font_variation_save_to_file.webp

将 FontVariation 保存为外部资源文件

假粗体和假斜体

在使用粗体和斜体字时,使用专门设计的字体变体可以产生更好的视觉效果。粗体字体中的字形间距更为一致,而斜体字体中的某些字形与正常字体完全不同(对比 "a" 和 "a")。

然而,使用真正的粗体和斜体字体需要更多的字体文件,导致发布文件大小增大。也可以使用单个 可变字体 文件,但该文件将会大于正常的单个不可变字体文件。文件大小在桌面版项目上通常不足为虑,但在意图保持分配文件大小尽可能小的移动 / web 版项目上可能成为问题。

为了在不需要发布额外字体(或者使用单个更大的字体文件)的情况下支持粗体和斜体,Godot 中支持 粗体和斜体。

假粗体 / 斜体(上),真粗体 / 斜体(下)。使用的正常字体:Open Sans SemiBold

假粗体 / 斜体(上),真粗体 / 斜体(下)。使用的正常字体:Open Sans SemiBold

如果没有为粗体和斜体提供自定义字体,则 RichTextLabel 中的粗体和斜体标签将自动使用假粗体和斜体。

若要使用假粗体,在需要 Font 资源的栏目中创建 FontVariation 资源。将 Variation > Embolden 设定为正值会加粗字体,而设定为负值则会让字体变细。建议采用 0.51.2 之间的值,具体视字体而定。

假斜体由歪斜字体创建,通过修改每个字符的变换实现。该功能同样由 FontVariation 提供,使用的是 Variation > Transform 属性。将字符变换中的 yx 分量设为一个正值会创建斜体效果。建议采用 0.20.4 之间的值,具体视字体而定。

调整字体间距

为了某些艺术效果,或提高可阅读性,你可能会想要调整 Godot 中显示字体的方式。

在需要 Font 资源的栏目中创建 FontVariation 资源。其中 Variation > Extra Spacing 部分有 4 个可用属性,均可接受正值和负值:

  • Glyph: 每个字形之间的额外间距。

  • Space: 单词之间的额外间距。

  • 顶部间距(Top): 字形上方的额外间距。这个设置不仅用于多行文本的排版,还会用来计算像 LabelButton 这类控件的最小尺寸。

  • 底部间距(Bottom) :字形下方的额外间距。这个设置不仅用于多行文本的排版,还会用来计算像 LabelButton 这类控件的最小尺寸。

还可以调节 Variation > Transform 来对字符进行拉伸。具体方式是调节 xx (横向缩放) and yy (纵向缩放) 分量。由于字形变换不会影响每个字形在文本中所占据的空间,使用时应切记进行相应的字形间距调整。因为大部分字体并非是为了在被拉伸环境下显示而设计,这种非均一的拉伸应谨慎使用。

OpenType 字体特性

Godot 支持启用 OpenType 字体特性,这是一种标准化的方式,可以在不切换完整字体文件的情况下进行替代字符的切换。虽然其名称是 OpenType 字符特性,但同样也支持 TrueType (.ttf) 和 WOFF/WOFF2 字体文件。

对 OpenType 特性的支持高度取决于所使用的字体。某些字体完全不支持 OpenType 特性,而另一些可以支持数十个可切换的特性。

使用 OpenType 字体特性有 2 种方法:

针对字体文件全局设置

在文件系统(FileSystem)面板中双击字体文件,即可打开‘高级导入设置(Advanced Import Settings)’对话框。你也可以在文件系统面板中先选中该字体,然后切换到‘导入(Import)’面板,再点击底部的 Advanced… 按钮:

../../_images/using_fonts_advanced_import_settings.webp

导入面板

在出现的对话框中,找到右侧侧边栏中的 元数据覆盖 > OpenType 特性 部分,点击 特性(0/N) 字样展开属性,然后点击 添加特性

../../_images/using_fonts_advanced_import_settings_opentype_features.webp

高级导入设置中的 OpenType 特性覆盖

针对字体用例设置(FontVariantion)

使用字体特性时,请和使用可变字体时一样创建 FontVariant 资源,然后在 FontVariation 资源中加载字体文件:

../../_images/using_fonts_font_variation_create.webp

创建 FontVariation 资源

../../_images/using_fonts_font_variation_load.webp

在 FontVariation 资源中加载字体文件

滚动到 FontVariation 的 OpenType Features 部分,点击 特性(0/N) 字样展开属性,然后点击 添加特性,在下拉列表中选择所需的特性:

../../_images/using_fonts_font_variation_opentype_features.webp

在 FontVariation 资源中指定 OpenType 特性

Inter 字体为例,下图中展示的是不带 Slashed Zero 特性(上)和启用 Slashed Zero OpenType 特性(上)的效果:

../../_images/using_fonts_font_variation_slashed_zero.webp

OpenType 特性比较(Inter)

可以通过添加 OpenType 特性后在检查器中取消勾选相应特性,为特定字体禁用连字和 / 或字偶剧:

../../_images/using_fonts_font_variation_disable_ligatures.webp

禁用字体的合字和字偶距

系统字体

警告

只有 Windows、macOS、Linux、Android、iOS 支持加载系统字体。

然而,Android 上加载系统字体不可靠,因为没有官方 API 提供支持。Godot 需要依靠解析系统配置文件,而这些文件可能会被第三方 Android 供应商修改。这可能导致系统字体加载不起作用。

系统字体和导入的字体属于不同类型的资源。它们实际上永远不会被真正导入到项目中,而是在游戏运行时(Runtime)直接加载。这样做有两个好处:

  • 这些字体不包含在导出的 PCK 文件中,使得导出项目的文件大小更小。

  • 这些字体不包含在导出项目中,可以避免将专有系统字体随项目发布所导致的许可问题。

引擎会自动使用系统字体作为回退字体,因此不加载自定义字体也能够显示中日韩字符以及 emoji。不过仍然会有一些限制,见使用 emoji 中的相关内容。

需要使用系统字体的地方,请创建 SystemFont 资源:

../../_images/using_fonts_system_font_create.webp

创建 SystemFont 资源

../../_images/using_fonts_system_font_specify.webp

指定 SystemFont 资源中使用的字体名称

你可以显式指定若干字体名称(例如 Arial),也可以指定字体的别名,后者会映射到系统中的“标准”默认字体:

字体别名

Windows

macOS/iOS

Linux

Android

sans-serif

Arial

Helvetica

由 fontconfig 处理

Roboto / Noto Sans

serif

Times New Roman

Times

由 fontconfig 处理

Noto Serif

monospace

Courier New

Courier

由 fontconfig 处理

Droid Sans Mono

cursive

Comic Sans MS

Apple Chancery

由 fontconfig 处理

Dancing Script

fantasy

Gabriola

Papyrus

由 fontconfig 处理

Droid Sans Mono

在 Android 上,拉丁、西里尔文本会使用 Roboto,中日韩等其他语言的字形会使用 Noto Sans。如果是第三方 Android 发行版,实际的字体可能会不同。

如果指定了多个字体,则会使用系统中(按从上至下的顺序)找到的第一个字体。所有平台上的字体名称和别名都不区分大小写。

和字体变体一样,你可以将 SystemFont 配置保存为资源文件,在其他地方使用。

请注意,不同系统字体的度量系统不同,也就是说,在一个平台上能够放进某个矩形的一段文本可能在另一个平台上就放不进。请在开发过程中保留足够的空间,让文本标签能够在按需扩展。

备注

与 Windows 和 macOS/iOS 不同,Linux 系统上默认提供哪些字体取决于发行版。也就是说,同样的系统字体名称和别名在不同的 Linux 发行版上可能会使用不同的字体显示。

运行时也可以加载字体,即便是未在系统中安装的字体也可以加载。详见《运行时加载与保存》

字体预渲染

使用传统的栅格字体时,Godot 会针对不同字体的不同尺寸进行字形的缓存。这样做能够减轻卡顿,但卡顿仍然会在项目的运行过程中首次显示某个字形时发生。如果使用的是较大的字体大小,或者是在移动设备上运行,就会尤为明显。

使用 MSDF 字体时,只需要执行一次特殊的带符号距离场纹理栅格化。这样就可以单纯针对字体进行缓存,无需考虑字体大小。不过 MSDF 字体的首次渲染相对于中等大小的传统栅格字体要慢。

为了避免与字体渲染相关的卡顿问题,可以对特定的字形进行预渲染。可以针对所有需要使用的字形进行预渲染(得到最优的效果),也可以只针对游戏中可能出现的常见字形进行预渲染(降低文件尺寸)。没有预渲染的字形会照常进行即时栅格化。

备注

无论是传统字体还是 MSDF 字体,栅格化都是在 CPU 上进行的。也就是说 GPU 的性能并不会影响字体栅格化的耗时。

在文件系统(FileSystem)面板中双击字体文件,即可打开‘高级导入设置(Advanced Import Settings)’对话框。你也可以在文件系统面板中先选中该字体,然后切换到‘导入(Import)’面板,再点击底部的 Advanced… 按钮:

../../_images/using_fonts_advanced_import_settings.webp

导入面板

前往“高级导入设置”对话框的预渲染配置选项卡,单击“加号”添加配置:

在“高级导入设置”对话框中添加新的预渲染配置

在“高级导入设置”对话框中添加新的预渲染配置

添加配置后,请单击对应的名称,确保选中该配置。双击名称可以重命名该配置。

在配置中添加字形的方法有两种。两种方法可以同时使用,效果会累积:

使用翻译中的文本

对于大多数项目而言,使用这个方法最方便,因为可以从语言翻译中自动提取文本。缺点是只有项目支持国际化时才能使用。否则请使用下面“使用自定义文本”的方法。

在‘项目设置’(Project Settings)里添加好翻译文件后,请切换到 Glyphs from the Translations(翻译中的字形) 选项卡,通过双击来勾选你需要检查的翻译文件,然后点击底部的 Shape All Strings in the Translations and Add Glyphs(对所有翻译字符串进行字形排版并添加字形) 按钮即可:

在‘高级导入设置’(Advanced Import Settings)对话框中,通过‘翻译中的字形’(Glyphs from the Translations)选项卡来启用预渲染

在‘高级导入设置’(Advanced Import Settings)对话框中,通过 翻译中的字形’(Glyphs from the Translations) 选项卡来启用预渲染

备注

当你更新翻译时,预渲染的字形列表并不会自动跟着更新。所以,如果你的翻译内容有了较大的改动,就需要重新操作一遍这个流程。

使用自定义文本

虽然这种方法需要你手动指定游戏中会出现的文本,但对于那些不需要用户输入文字的游戏来说,它其实是最高效的做法。对于手游来说,非常值得尝试一下这种方式,因为它能有效减小最终发布的应用程序的文件大小。

如果想使用现有的文本作为预渲染的基准,请进入‘高级导入设置’(Advanced Import Settings)对话框的 Glyphs from the Text(文本中的字形) 子选项卡,在右侧的窗口中输入文本,然后点击对话框底部的 Shape Text and Add Glyphs(字形排版并添加字形) 按钮即可:

在‘高级导入设置’(Advanced Import Settings)对话框中,通过‘文本中的字形’(Glyphs from the Text)选项卡来启用预渲染

在‘高级导入设置’对话框中,通过 Glyphs from the Text(文本中的字形) 选项卡来启用预渲染

小技巧

如果你的项目支持 internationalization ,你可以直接把 CSV 或 PO 文件的内容粘贴到上面的输入框里,这样就能快速预渲染出游戏过程中可能出现的所有字符(不包括用户自定义输入或无法翻译的字符串)。

通过启用字符集

第二种方法需要的配置更少,而且即使游戏里的文本内容发生变动,也几乎不需要再去更新设置。因此,它更适合文本量巨大的游戏,或者带有聊天系统的多人游戏。但另一方面,它可能会导致一些游戏里根本不会出现的文字也被预渲染了,这在文件大小(资源占用)方面就显得没那么高效了。

如果想使用现有的文本作为预渲染的基准,请进入‘高级导入设置’(Advanced Import Settings)对话框的 Glyphs from the Character Map(字符映射表中的字形) 子选项卡,然后 双击 右侧需要启用的字符集即可:

在‘高级导入设置’(Advanced Import Settings)对话框中,通过 Glyphs from the Character Map(字符映射表中的字形)选项卡来启用预渲染

在‘高级导入设置’(Advanced Import Settings)对话框中,通过 Glyphs from the Character Map(字符映射表中的字形) 选项卡来启用预渲染

为了确保完全预渲染,你需要根据游戏支持的语言来启用相应的字符集。对于英文,只需要启用 基本拉丁语(Basic Latin) 就可以了。如果同时启用 Latin-1 增补(Latin-1 Supplement),就能覆盖更多的语言,比如法语、德语和西班牙语。如果是俄语,就需要启用 西里尔文(Cyrillic),以此类推。

默认项目字体属性

在高级“项目设置”的 GUI > 主题部分中,可以对默认字体的渲染方式进行选择:

  • 默认字体抗锯齿(Default Font Antialiasing): 控制用于项目默认字体的 antialiasing 方法。

  • 默认字体微调(Default Font Hinting) : 控制用于项目默认字体的 hinting 方法。

  • 默认字体子像素定位(Default Font Subpixel Positioning) 控制默认项目字体的 subpixel positioning 方法。

  • 默认字体多通道有符号距离场(Default Font Multichannel Signed Distance Field): 如果设置为 true,将使项目的默认字体使用 MSDF font rendering 而非传统的栅格化方式。

  • 默认字体生成 Mipmaps( Default Font Generate Mipmaps ): 如果设置为 true (开启),将为项目的默认字体启用 mipmap 的生成与使用。

备注

这些项目设置 会影响项目的默认字体(也就是硬编码在引擎二进制文件里的那个字体)。

自定义字体的属性则是由它们各自的导入选项来决定的。你可以在‘项目设置’(Project Settings)对话框的 导入默认值( Import Defaults ) 部分,来修改自定义字体的默认导入选项。