使用字型
Godot 允許你為不同的 UI 節點指定特定的字型。
你可以在三個地方設定字型。第一是在主題編輯器,選取你要設定的節點並切換到字型分頁。第二是在控制節點的屬性檢視器裡的 主題覆寫 > 字型。最後是在主題的屬性檢視器裡的 預設字型 欄位。
如果沒有指定任何字型覆寫,就會使用 Open Sans SemiBold 作為預設專案字型。
備註
自 Godot 4.0 起,字型大小不是在字型本身設定,而是在使用該字型的節點設定。你可在屬性檢視器的 主題覆寫 > 字型大小 區域調整。
這讓你能直接調整字型大小,而不用為每種大小分別複製字型資源。
字型檔案分為兩種:動態*(TTF/OTF/WOFF/WOFF2 格式)和*點陣*(BMFont ``.fnt`` 格式或等寬圖像)。動態字型最常見,可以自由縮放而且放大後依然清晰。由於是向量格式,能在保持合理檔案大小的同時收錄更多字元。動態字型也支援點陣字型無法做到的進階功能,如 *連字 (多個字元合為一個特殊形狀)。
也參考
你可以參考 BiDI 與字型功能展示專案,親自體驗字型在實際 UI 的運作方式。
動態字型
Godot 支援下列動態字型格式:
TrueType 字型或合集(
.ttf、.ttc)OpenType 字型或合集(
.otf、.otc)Web 開放字型格式 1(
.woff)Web 開放字型格式 2(
.woff2,自 Godot 3.5 支援)
雖然 .woff,特別是 .woff2 通常會讓檔案更小,但沒有絕對最好的字型格式。通常建議使用字型原廠網站所提供的格式。
點陣字型
Godot 支援 BMFont(.fnt)點陣字型格式,這是由 BMFont 所建立的格式。也有其他相容工具,如 BMGlyph 或線上 fontcutter。
你也可以匯入任何圖像作為點陣字型,但只支援**等寬字型**(每個字元寬度相同)。作法是在檔案系統面板選取圖像,切到匯入面板,將匯入類型設為 字型資料(等寬圖像字型),然後點選 重新匯入:
將匯入類型設為 字型資料(等寬圖像字型)
字型的字元順序可以自訂,但建議比照標準 Unicode 排序,這樣匯入設定更簡單。例如,下方範例的點陣字型收錄 ASCII 字元且排序遵循 ASCII 標準:
圖片來源:LibreQuake (已縮放裁剪移除擴展區段)
以下匯入選項可成功匯入上述字型圖片:
上述範例字型的匯入選項
字元範圍 選項是一個陣列,對應圖片上每個字元的位置(以格子座標,不是像素)。字型圖集依左到右、上到下順序排列。字元可用十進位(127)、十六進位(0x007f)或*單引號*('~')指定,範圍可用連字號標示。
舉例來說,0-127``(或 ``0x0000-0x007f)代表完整 ASCII 範圍。又如,' '-'~' 等同於 32-127,即*可列印*(可見)ASCII 字元範圍。
請確保 字元範圍 不超過定義的 欄數 × 列數,否則將無法匯入字型。
如果字型圖片周圍有不是字型圖案的空白(如作者資訊),可以調整 圖像邊距,這會對整張圖片一次性加上外圍邊距。
若字型圖片中有輔助線(如字元間的間隔線)或字元間距顯示不正確,可以調整 字元邊距,此數值會套用到每個匯入的字元。
載入字型檔案
若要載入字型檔案(動態或點陣),請在字型屬性旁邊的資源下拉選單選擇 快速載入 或 載入,然後瀏覽選取字型檔案:
載入字型檔案
你也可以直接把字型檔案從檔案系統拖曳到屬性檢視器中需要 Font 資源的欄位。
警告
Godot 4.0 起,紋理過濾與重複屬性都是在使用紋理的地方設定,而非紋理資源本身。字型(動態與點陣)也採同樣設計。
若你的字型是像素風格(Pixel Art),應該把 算圖 > 紋理 > Canvas 紋理 > 預設紋理過濾 專案設定調成 最近點,以停用雙線性過濾。
字型大小應為設計尺寸的整數倍(視字型而定),且使用該字型的 Control 節點也要用整數倍縮放,否則字型可能會模糊。Godot 的字型大小單位是像素(px),不是點(pt),請在跨軟體比對時特別注意。
你也可以在繼承自 CanvasItem 的節點上,設定 CanvasItem.texture_filter 來個別調整紋理過濾模式。
字型描邊與陰影
字型描邊與陰影有助於在無法預知背景顏色時提升可讀性,例如 2D/3D 場景疊加的 HUD 元件。
除了 Label3D,大多數繼承自 Control 的節點也支援字型描邊功能。
要為特定節點啟用字型描邊,請在屬性檢視器的主題覆寫區調整 字型描邊顏色 與 描邊寬度,效果如下:
字型描邊範例
備註
如果使用 MSDF 算繪的字型,請將 MSDF 像素範圍 匯入選項設為至少為描邊寬度的兩倍,以確保描邊正常顯示,否則描邊可能會被過早裁切。
字型陰影支援較有限,目前僅 Label 和 RichTextLabel 有提供。此外,陰影邊緣為硬邊(你可調整透明度讓其較柔和)。要啟用字型陰影,請在 Label 或 RichTextLabel 節點的主題覆寫區設定 字型陰影顏色、陰影 X 偏移 與 陰影 Y 偏移:
在 Label 節點中設定字型陰影
效果如下圖所示:
字型陰影範例
小訣竅
你也可以建立 LabelSettings 資源並指定給多個 Label 節點,來在單一 Label 節點局部覆寫字型顯示,這會優先於 主題屬性。
進階字型功能
抗鋸齒
你可以透過調整*抗鋸齒*和*微調*(hinting)來改變字型算圖平滑效果,這兩種屬性針對不同需求適用。
抗鋸齒決定字型光柵化時字元邊緣的平滑程度。預設的**灰階**抗鋸齒效果適用於所有顯示器,但字型很小時可能會顯得模糊。
你可以透過 LCD 子像素優化來增強鋸齒平滑的銳利度,這技巧會根據 LCD 顯示器的紅綠藍子像素排列,對每個色頻分開運算。但缺點是遇到非標準 RGB 子像素排列的顯示器(如 OLED)時,邊緣可能會出現色邊。
大多數遊戲建議使用預設 灰階 抗鋸齒。非遊戲應用則可考慮 LCD 子像素優化。
由上至下:停用、灰階、LCD 子像素 (RGB)
備註
MSDF 算繪字型 無法調整抗鋸齒,只能用灰階抗鋸齒。
微調(Hinting)
微調(Hinting)決定字元邊緣在光柵化時對齊像素的強度。無 最平滑但小字型易模糊,淺**(預設)會將字元高低對齊像素更清楚,**完整 則將橫直兩軸都對齊像素,效果最銳利。可依個人喜好選擇模式。
由上至下:無、淺、完整微調
備註
如果點擊 重新匯入 後改變微調模式沒有效果,通常代表該字型檔本身沒有微調指令。你可以找有微調資訊的版本,或在匯入面板啟用 強制自動微調,這會用 FreeType 的自動微調器自動產生微調指令。
子像素定位
Godot 支援調整子像素定位(Subpixel Positioning),這是 FreeType 的功能,讓字型算繪更接近原始設計。預設 自動 會在字型較小時啟用,字型較大時停用,以提升效能。
你也可以強制設定子像素定位為**停用**、半像素**或**四分之一像素。四分之一像素效果最佳但會略影響效能。
調整抗鋸齒、微調和子像素定位,對小字型最明顯。
警告
如果是像素風(Pixel Art)字型,建議將子像素定位設為**停用**,否則像素大小可能顯得不均勻。
點陣字型不需設定子像素定位,這只影響動態(向量)字型。
Mipmap(多重貼圖)
預設情況下,字型不會產生 mipmap 以節省記憶體與提升光柵化效率。但這會讓縮小後的字型產生顆粒感,特別是在 3D 文字 未啟用**固定大小**時,或是在 Control 節點縮放小於 (1, 1) 且使用傳統光柵化(非 MSDF)字型時更明顯。
在檔案系統選取字型後,可在匯入面板啟用 Mipmaps 來改善縮小字型的顯示品質。
MSDF 字型也能啟用 Mipmap,雖然小於預設尺寸時會略為改善顯示品質,不過 MSDF 字型本身就很抗鋸齒,不太會有顆粒問題。
MSDF 字型算繪
多通道帶符號距離場(MSDF)字型算繪允許你任意縮放字型,且不必每次改變大小都重新光柵化。
MSDF 字型算繪相較於 Godot 傳統字型光柵化有兩個主要優點:
字型再大也總是清晰。
首次顯示*大字型*時不會卡頓,因為不須即時光柵化。
MSDF 字型算繪的缺點:
基礎算圖成本較高,桌面平台通常感覺不出差異,但在低階行動裝置會有影響。
小字型缺乏微調(Hinting),不如傳統光柵化清晰。
首次顯示*小字型*的新字元時,算圖成本比傳統光柵化更高。可以使用 字型預先算繪 預先算繪減輕這個問題。
MSDF 字型無法啟用 LCD 子像素優化。
帶有自我交錯輪廓的字型在 MSDF 模式下無法正確顯示。如果你在 Google Fonts 下載的字型出現算繪問題,建議改從原作者官網下載。
字型光柵化方式比較。由上至下:無超取樣的光柵化、有超取樣、MSDF
要為某個字型啟用 MSDF 算繪,在檔案系統中選取該字型,切換至匯入面板,啟用 多通道帶符號距離場,然後點選 重新匯入:
在字型匯入選項中啟用 MSDF
使用表情符號(Emoji)
Godot 對 Emoji 字型的支援有限:
支援 CBDT/CBLC(內嵌 PNG)與 SVG Emoji 字型。
不支援 COLR/CPAL(自訂向量格式)Emoji 字型。
不支援 EMJC 點陣圖壓縮(iOS 系統 Emoji 字型專用)。若要在 iOS 支援 Emoji,請改用支援 SVG 或 PNG 的自訂字型。
要讓 Godot 能正確顯示 Emoji,所用字型(或其 後備字型)必須收錄對應字元。否則會出現方框佔位符(又稱「豆腐」字元):
標籤嘗試顯示 Emoji 時的預設外觀
加入收錄 Emoji 的字型(如 Noto Color Emoji)後,就能正確顯示表情符號:
加上 Emoji 字型後標籤顯示的正確效果
若想讓一般字型可同時顯示 Emoji,建議在進階匯入設定裡設 後備字型 指向 Emoji 字型。如果你想用預設專案字型但又能顯示 Emoji,請在 FontVariation 留空 Base Font,並新增後備字型指向 Emoji 字型:
小訣竅
Emoji 字型通常很大,你可以考慮 載入系統字型 來提供 Emoji,而不必把字型檔打包進專案。這樣能全面支援 Emoji 而不會讓匯出檔變大。但缺點是不同作業系統的 Emoji 外觀會不同,且非所有平台都支援系統字型。
你也可以用系統字型當成後備字型。
使用圖示字型
像 Fontello 這類工具可以把 SVG 匯入並產生字型檔案,可用於在文字中顯示自訂向量圖,也能搭配 3D 文字 與 TextMesh 製作 3D 圖示。
備註
Fontello 目前不支援多色字型(雖然 Godot 支援顯示)。截至 2022 年 11 月,大多數圖示字型產生工具對多色字型支援都很有限。
視你的需求,這種做法有時會比在 RichTextLabel 用 img 標籤更好。因為圖示字型是真正的向量圖,能無損縮放,而一般點陣圖(或匯入後已柵格化的 SVG)會失真。
下載產生的字型後,載入到 Godot 專案並指定給 Label、RichTextLabel 或 Label3D 節點。到 Fontello 網頁介面選取要用的符號,按 Ctrl + C`(macOS 為 :kbd:`Cmd + C)複製,然後貼到 Label 節點的 Text 屬性。在屬性檢視器可能只見到佔位字元,但在 2D/3D 檢視區會正常顯示。
若要在同一個 Control 內同時用一般字型與圖示字型,可把圖示字型設為 後備字型。這可行是因為圖示字型使用 Unicode 專用區段,該區專為自訂字型保留,不會與標準字元衝突。
備註
某些現代圖示字型(如 Font Awesome 6)有版本支援*連字*,你只需在 Text 輸入圖示名稱(如 house)就會自動顯示該圖示。
不過這種寫法無法與字型後備共用,因為主要字型的字元會優先於後備字型的連字。
字型後備
Godot 支援設定一個或多個後備字型,當主字型缺少某字元時自動轉用其他字型。主要應用場景有兩個:
主字型只收錄拉丁文,若要顯示西里爾文等其他語系,就設後備字型來補足。
一個字型顯示一般文字,另一個則專門顯示表情符號或圖示。
在檔案系統面板雙擊字型檔打開進階匯入設定。也可以選取字型後在匯入面板點選底部的 進階…。
匯入面板
在對話框右側找到 Fallbacks 區段,點 Array[Font] (size 0) 展開,然後點 Add Element 新增後備字型:
新增字型後備
點新元素旁的下拉箭頭,選擇 快速載入 或 載入 選項來指定字型檔案:
載入後備字型
即使使用預設專案字型也能加後備字型。方法是將 Base Font 留空,再加入一個或多個後備字型。
備註
你也可以像 OpenType 字型功能 那樣在本地設定後備字型,這裡就不贅述。
可變字型
Godot 完整支援 可變字型,只需一個字型檔就能表現多種粗細與樣式(如標準、粗體、斜體等),前提是你用的字型檔本身支援可變功能。
要使用可變字型,請在需用字型之處建立 FontVariation 資源,再在裡面載入字型檔案:
建立 FontVariation 資源
在 FontVariation 資源中載入字型檔
往下找到 FontVariation 的 變化 區段,點 變化座標 展開可調整的軸:
可調整軸列表
可調整的軸依所載入的字型而異。有些僅支援單一軸(如*粗細*或*傾斜*),有些則可多軸切換。
例如,這是 Inter V 字型,粗細 設為 900、傾斜 設為 -10:
可變字型範例(Inter V)
小訣竅
雖然可變字型軸名稱和刻度沒有統一標準,但字型設計師一般會遵循某些慣例。 weight (粗細)軸在 OpenType 標準中對應如下:
軸值 |
實際字型粗細 |
|---|---|
|
極細(髮絲) |
|
超細 |
|
細 |
|
標準(Regular) |
|
中等 |
|
半粗 |
|
粗體 |
|
超粗 |
|
極粗(黑體) |
|
極黑 |
你可將 FontVariation 存成 .tres 資源檔,方便其他地方重複使用:
將 FontVariation 存為外部資源檔
仿粗體與仿斜體
要顯示粗體或斜體,最好用專門設計的字型變體。粗體能讓字元間距一致,斜體則有些字元形狀完全不同(如直體與斜體的「a」)。
但若要支援真正的粗體與斜體就必須多帶字型檔,會讓專案體積變大。雖然可用 可變字型 取代多檔案,但單一可變字型檔也會比單一普通字型大。對桌面應用影響不大,行動與網頁專案則需考量容量。
為了讓專案不用附加粗體/斜體字型(或大容量可變字型),Godot 支援 仿粗體/仿斜體。
仿粗體/仿斜體(上),真正的粗體/斜體(下)。所用一般字型:Open Sans SemiBold
如果你沒給 RichTextLabel 指定粗體/斜體字型,自動會用仿粗體/仿斜體。
要產生仿粗體,可在需 Font 資源的欄位建立 FontVariation,調整 變化 > 加粗(Embolden) 為正值(讓字型更粗),或負值(反之)。建議值為 0.5 ~ 1.2,依字型而異。
仿斜體則是將字元傾斜,可在 FontVariation 的 變化 > 變換(Transform) 內設定字元轉換的 yx 為正值。建議數值約 0.2 ~ 0.4,依字型而定。
調整字型間距
你可以因應美術需求或可讀性,自行調整字型在 Godot 的顯示方式。
你可在需 Font 資源的屬性建立 FontVariation,變化 > 額外間距 有 4 欄可調(支援正負值):
字元: 每個字元之間的間距。
空白: 單字之間的間距。
變化 > 變換(Transform) 也能拉寬或拉高字元(調整 xx 水平比例、yy 垂直比例),但請記得同步微調間距,因為字型拉伸不會自動調整間隔。這種非等比例縮放不建議常用,因大多數字型未針對拉伸做設計。
OpenType 字型功能
Godot 支援啟用 OpenType 字型功能,這是一種標準方式,可切換替代字元而不必更換字型檔。雖然叫 OpenType 功能,其實 TrueType(.ttf)與 WOFF/WOFF2 也支援。
是否支援 OpenType 功能取決於字型本身。有些字型完全沒支援,有些則提供數十種可切換特性。
使用 OpenType 字型功能有兩種方式:
針對整個字型檔
在檔案系統面板雙擊字型檔打開進階匯入設定。也可以選取字型後在匯入面板點選底部的 進階…。
匯入面板
在出現的對話方塊中,在右側側邊欄上尋找**元資料覆蓋> OpenType 功能**部分,按一下**功能(N 群組中的0 個)** 文字以展開屬性,然後按一下**新增特徵**:
進階匯入設定中的 OpenType 功能覆寫
針對特定用法(FontVariation)
要啟用字型功能,請像前述 可變字型 那樣建立 FontVariation,然後載入字型檔案:
建立 FontVariation 資源
在 FontVariation 資源中載入字型檔案
往下找到 FontVariation 的 OpenType Features 區段,點選 Features (0 of N set) 展開,再按 Add Feature 從下拉選單選擇功能:
在 FontVariation 資源指定 OpenType 功能
例如,下圖為 Inter 字型,未啟用 Slashed Zero 功能(上),啟用後(下):
OpenType 功能對比(Inter)
你也可以新增 OpenType 功能後,在屬性檢視器取消勾選,來停用特定字型的連字或字偶距:
停用某字型的連字與字偶距
系統字型
警告
只有 Windows、macOS、Linux、Android 和 iOS 支援載入系統字型。
但 Android 平台沒有官方 API,Godot 只能靠解析系統設定檔來找字型,如果手機廠商有自訂,載入系統字型可能會失敗。
系統字型與匯入字型不同,專案不會真正含有這些資源,而是執行時載入。這有兩個優點:
字型不會被打包進匯出檔,專案體積較小。
不用附帶專有字型,也可避免授權問題。
引擎會自動用系統字型做為後備字型,這樣不需額外字型也能顯示 CJK 字元與 Emoji。但如 表情符號支援 所述,有些限制。
在你要用系統字型的地方建立 SystemFont 資源:
建立 SystemFont 資源
在 SystemFont 資源中指定字型名稱
你可以明確指定一或多個字型名稱(如 Arial),或指定*別名*,以對應系統的「標準」預設字型:
字型別名 |
Windows |
macOS/iOS |
Linux |
Android |
|---|---|---|---|---|
|
Arial |
Helvetica |
由 fontconfig 管理 |
Roboto / Noto Sans |
|
Times New Roman |
Times |
由 fontconfig 管理 |
Noto Serif |
|
Courier New |
Courier |
由 fontconfig 管理 |
Droid Sans Mono |
|
Comic Sans MS |
Apple Chancery |
由 fontconfig 管理 |
Dancing Script |
|
Gabriola |
Papyrus |
由 fontconfig 管理 |
Droid Sans Mono |
Android 上拉丁文/西里爾文預設用 Roboto,其它語系(如 CJK)用 Noto Sans。第三方 Android 系統可能選擇不同字型。
若指定多個字型,系統會依序優先使用最先找到的。字型名稱與別名在所有平台都不分大小寫。
如同字型變體,你也可以把 SystemFont 設定存成資源檔重複利用。
請注意,不同系統字型的排版寬度不一,同樣內容在不同平台可能會超出原本的矩形空間,開發時務必預留餘裕。
備註
與 Windows、macOS/iOS 不同,Linux 的預設字型取決於發行版。因此同一字型名稱或別名在不同 Linux 可能顯示不同字型。
即使系統未安裝字型,也可在執行時載入自訂字型。詳見 執行時載入與儲存。
字型預先算繪
使用傳統光柵化字型時,Godot 會依字型與大小快取字元,減少卡頓。不過專案執行時首次顯示新字元仍可能卡,特別是大字型或行動裝置。
MSDF 字型只需光柵化一次生成特殊距離場貼圖,因此快取是以字型為單位,跟字型大小無關。但 MSDF 首次算圖速度比中等大小的傳統光柵字型慢。
為避免字型顯示時卡頓,你可以*預先算繪*常用字元。可以全部都算繪(效果最佳),也可以只挑常見字元(壓縮資源體積)。沒預先算繪的字元還是會即時光柵化。
備註
無論傳統還是 MSDF,字型光柵化都在 CPU 執行,與 GPU 效能無關。
在檔案系統面板雙擊字型檔打開進階匯入設定。也可以選取字型後在匯入面板點選底部的 進階…。
匯入面板
在進階匯入設定切到 預先算繪組態 分頁,按「+」新增組態:
在進階匯入設定新增預先算繪組態
新增後請點一下組態名稱以選取。可雙擊重新命名。
你可以用兩種方法把字元加入預先算繪組態,也可混用:
從翻譯內容取得字元
多數專案最方便的作法是自動從翻譯(多語)檔取得所有字元。但這必須專案有設定 國際化。否則請用下述「自訂文字」法。
專案設定加入翻譯後,切到 翻譯字元 分頁,雙擊檢查所有翻譯,再點下方 將所有翻譯字串整理並加入字元:
在進階匯入設定啟用 翻譯字元 預先算繪
備註
如果翻譯檔有大幅更新,預算繪字元清單不會自動同步,需手動再執行一次上述程序。
從自訂文字取得字元
這種方式需手動列出遊戲中會用到的所有字元,但對沒有用戶輸入的遊戲來說最有效率。行動遊戲若想壓縮安裝檔體積,值得採用這法。
若要用現有文字當預先算繪依據,請切到進階匯入設定的 文字字元 分頁,在右邊輸入要收錄的內容,然後點下方 整理文字並加入字元:
在進階匯入設定啟用 文字字元 預先算繪
小訣竅
如果你的專案有國際化 (internationalization),直接貼上 CSV 或 PO 檔內容,就能一次性算繪所有遊戲會用到的字元(但不含玩家自訂輸入或不可翻譯的字串)。
啟用字元集
這種方法不用每次文字變更都重設組態,適合大量文字或有聊天功能的遊戲。但缺點是會預算繪許多實際不會用到的字元,檔案也會變大。
要用字元集當預設,請切到進階匯入設定的 字元集 分頁,右側*雙擊*要啟用的字元集:
在進階匯入設定啟用 字元集 預先算繪
要完整預先算繪,需依遊戲支援語言開啟相應的字元集。英文只要 Basic Latin,如需支援法語、德語、西班牙語,請同時啟用 Latin-1 Supplement。俄文則要啟 Cyrillic,以此類推。
預設專案字型屬性
在進階專案設定的 GUI > 主題 區段,你可以調整預設字型的算繪方式:
預設字型抗鋸齒: 控制預設專案字型的 抗鋸齒 方法。
預設字型微調: 決定預設專案字型用的 微調 方法。
預設字型子像素定位: 決定預設專案字型用的 子像素定位 方法。
預設字型多通道帶符號距離場: 設為
true時,預設專案字型會用 MSDF 字型算繪,而非傳統光柵化。預設字型產生 Mipmap: 設為
true時,會為預設專案字型產生與使用 mipmap。
備註
這些專案設定*僅限*影響預設專案字型(即內建字型)。
自訂字型的屬性則由其匯入選項決定。你可在專案設定的 匯入預設值 區覆蓋自訂字型的匯入選項。