新增:街機、漫畫、Material 3,以及給孩子的外觀
四個新系列加入了預設、科幻與中世紀的行列 — 現在共有十四種內建外觀,每種都有深色與淺色。 每個控制項、彈出視窗與 HUD 元件都能直接套用,程式碼一行都不用改:換掉預設集,整個畫面就跟著變。

material_light
material_dark
kids_light
kids_dark
comic_light
comic_dark
arcade_light
arcade_darkMaterial 3 — 給應用畫面
對照官方 M3 權杖逐項量過的 Material 3 Expressive:48dp 觸控目標裡附 40dp 底板的膠囊按鈕、 28dp 的對話方塊與底部面板、填色卡片、外框輸入欄,以及 Expressive 滑桿。應用元件 — 導覽列、頂端應用列、FAB、 搜尋列、方塊標籤、進度與日期選擇器 — 依循 M3 元件權杖,標題使用內附的 Roboto。適合商店、設定、收件匣,以及每一個應該讓人覺得像應用程式的畫面。
兒童 — 玩具箱
為孩子而做:每個按鍵、清單列與面板都是一顆果凍糖,帶粗描邊與一道實心底邊,按下時會陷進去; 每類控制項各有自己的蠟筆顏色。快捷格是糖果方塊,徽章是貼紙,搖桿是一道彩虹,視窗有陽光色的標題緞帶與 圓形的糖果關閉按鈕,按下去還會被壓扁。尺寸與你專案的字型都維持原樣。
漫畫 — 粗墨線
每個表面都是一格漫畫分鏡:粗墨線描邊裡填著表面顏色,背後襯一道硬陰影,表面被按下時陰影隨之消失。 一個設定開關所有陰影,另外兩個設定決定描邊粗細與陰影大小,一次呼叫就能對單一控制項做同樣的事。視窗有黃色的標題框。
街機 — 上色的按鍵
每個按鍵都上了色 — 漸層、一道白色高光與按下時會陷進去的底邊,全都裝在藏青色的墨線描邊裡 — 標籤是帶墨線描邊的白字:開始用綠色,其餘用藍色,刪除用紅色。面板很厚,一圈彩色外框圍著淺色內芯; 視窗有金色的標題橫幅與一個圓形的紅色關閉鍵。
GoUi.use_preset(GoThemePresets.MATERIAL_LIGHT) # 或 MATERIAL_DARK
GoUi.use_preset(&"kids_light") # 或 &"kids_dark"
GoUi.use_preset(&"comic_light") # 或 &"comic_dark"
GoUi.use_preset(&"arcade_light") # 或 &"arcade_dark"
Material 3 詳解 → · 兒童外觀詳解 → · 街機外觀,逐一控制項看 ↓ · 漫畫外觀,逐一控制項看 ↓ · 同一個彈出視窗在全部十四種外觀下的樣子 →
街機:上色的按鍵與厚實的面板
這款最新的外觀把每個畫面都打扮成一台街機。每個按鍵都上了色 — 從淺色頂端過渡到深色底部的漸層、
一道白色高光與按下時會陷進去的底邊,全都裝在藏青色的墨線描邊裡 — 標籤是帶墨線描邊的白字。
每塊面板都很厚:一圈自帶高光的彩色外框圍著淺色內芯。
arcade_light 在天藍色頁面上放白色面板;arcade_dark 在夜色頁面上放藏青色面板。
下面每一張圖都是真實的 gohud 畫面 — 同樣的程式碼,只差一行預設集。
GoUi.use_preset(&"arcade_light") # 或 &"arcade_dark"

arcade_light · 藝廊
arcade_dark · 藝廊
GoDialogs
GoSheet
GoCoachMark
GoDrawer
GoPopover
GoDialogs.alert()
GoSnackbar每個按鍵都上了色

GoStyle.button()
GoStyle.tabs()


GoStyle.card()
GoForm
GoStyle.choice_grid()
GoSlotGrid

GoDatePicker
GoStyle.slider()
GoStyle.radio_group()
GoStyle.filter_chip()
GoSearchBar
GoStepper
GoTable
GoNavBar
GoTimePicker
GoCodeInput
GoWheelPicker夜裡:arcade_dark
在深色頁面上,墨色變得深得多,成了頁面本身,而按鍵的顏色依舊鮮亮。

GoStyle.button()
GoBar
GoStyle.hud_panel()
GoSlot
GoJoystick

GoFab
GoRewardCalendar

GoTabView
GoScroll

GoStyle.chip()
GoSlotGrid
GoRangeSlider
GoPagination
GoBadge街機外觀是怎麼做到的
表面
每個按鍵與面板都是一個 GoStyleBoxArcade:墨線描邊、漸層主體、底邊與高光,全都畫在控制項自己的矩形裡 —
按鍵在各種狀態下大小不變,按下只是讓它陷進去。
看得清的標籤
帶墨線描邊的白色標籤,在描邊能隔開的任何顏色上都看得清 — WCAG 把描邊算作字母的一部分。 每種顏色都會被調整,直到它的標籤在漸層的每個高度上都超過 4.6:1。
視窗
視窗標題以帶墨線描邊的白字放在金色橫幅上,旁邊是一個圓形的紅色關閉鍵。對話方塊、底部面板、抽屜與彈出泡泡都是 帶厚外框的面板。
單一按鍵可以有自己的顏色 — 例如暫停選單裡一個橘色的商店鍵:
menu.add_child(GoStyle.arcade_paint(GoStyle.button("Shop", _shop), Color("#FF8A1E")))
漫畫:粗墨線與硬陰影
漫畫外觀把每個表面都畫成一格漫畫分鏡 — 粗墨線描邊裡填著表面顏色,
往右下方投出一道紮實的硬陰影。comic_light 在紙張般的奶油色頁面上用黑墨描畫,主色是鈷藍;
comic_dark 在夜色頁面上用奶油色墨線描畫,主色是黃色。下面每一張圖都是
真實的 gohud 畫面 — 同樣的程式碼,只差一行預設集。
GoUi.use_preset(&"comic_light") # 或 &"comic_dark"

comic_light · 藝廊
comic_dark · 藝廊
GoSheet
GoCoachMark
GoDrawer
GoPopover每個控制項都描上墨線
按鈕、開關、分頁、滑桿、卡片、表單、表格、選擇器與方塊標籤全都描上了墨線 — 不必一個個 去設定樣式。按下一個按鍵,它的陰影就消失:表面像蓋章一樣沉進自己的位置。 停用的表面失去陰影並變淡,能按的與不能按的一眼就分得清。

GoStyle.button() — 所有種類


GoStyle.tabs()

GoStyle.slider()

GoStyle.card()
GoForm

GoTable
GoDatePicker
GoTimePicker
GoStepper

GoNavBar
GoInputGroup
GoSplitButton
GoPagination夜裡:comic_dark
在深色頁面上黑色描邊會消失不見,所以 comic_dark 用奶油色畫描邊,並投下一道帶著同樣墨色的
淡淡陰影。HUD 元件 — 快捷格、量條、搖桿與獎勵日曆 — 遵循同樣的規則。

GoStyle.button()
GoSlot
GoBar
GoJoystick

GoSlotGrid
GoRewardCalendar

GoRangeSlider
GoSearchBar
GoFab漫畫外觀是怎麼做到的
所有表面共用一個 StyleBox
每個表面都是一個 GoStyleBoxComic:填色、描邊與陰影,都畫在控制項自己的矩形之內。它每次繪製時都從 GoConfig 讀取描邊與陰影的大小,所以改一個設定,整個畫面立刻一起變。
按下就是平的
按下的按鍵收起陰影,挪進陰影的位置。滑鼠停留時陰影保留;取得焦點時加一圈內側墨線環,絕不會蓋住描邊;停用的表面失去陰影並變淡。
其餘交給外觀描線
GoSkinComic 替程式碼畫出的部分描上墨線:快捷格、方塊標籤、徽章、頭像、提示、導覽列、FAB、日期格子,還有握把會投下陰影的搖桿。
視窗有標題框
視窗標題放在一個黃色標題框裡,就像漫畫裡的旁白框,旁邊是一顆描了墨線的圓形關閉按鈕。對話方塊、底部面板、抽屜與彈出泡泡都是不透明的墨線面板。
白天晚上都清楚好讀
兩套調色盤都和其他所有預設集一樣通過 WCAG 對比檢查,按下與停用的按鍵也不例外。當標題框的顏色與頁面太接近時,它的描邊會退回頁面顏色。
版面不變
描邊與陰影都收在每個控制項之內,內距維持佈景主題給的樣子,所以用別的外觀排好的畫面會維持原本的版面 — 你專案的字型也一樣。
三個設定與一次呼叫
三個 GoConfig 設定會一次改變所有漫畫表面。不需要重建任何東西 — 設定的同時畫面就會重畫。
GoUi.config.comic_border_width = 2.0 # 描邊(dp)— 預設 3
GoUi.config.comic_shadow_size = 6.0 # 陰影(dp)— 預設 4
GoUi.config.comic_shadow = false # 所有地方都不要陰影
單一控制項可以不管設定,自行其是。把 true 當成最後一個引數傳入,就連它裡面的一切都包含在內。
GoStyle.comic_shadow(skip_button, false) # 這顆按鈕平貼著
GoStyle.comic_shadow(card, true, true) # 這張卡片與其中的一切保留陰影
GoStyle.comic_border(title, 5.0) # 只給這一個加粗描邊
tools/new_theme.py inked --from comic_light 會複製調色盤;改掉紙張、
墨線與主色,再執行 tools/make_theme.py inked。墨線、陰影與外觀都會一併帶上。
在遊戲裡長什麼樣
中世紀與科幻預設集 — 角色面板、背包與任務;表單、格狀排列與提示卡;稜角分明的面板與觸控操作。 切換預設集只要一行程式碼。
它替你處理掉的事
遊戲 UI 最花時間的從來不是按鈕長什麼樣 — 而是那些在不同裝置之間逐漸走樣的一切。 gohud 把這些走樣集中在一個地方處理。
每個尺寸都是一個 token
間距、圓角與文字大小都用名稱呼叫,不寫死成數字。換一份佈景主題,整個畫面就跟著動。
看得到的尺寸 ≠ 按得到的尺寸
關閉按鈕看起來是 36dp,觸控範圍卻是 48dp。快捷格擠在一起而互相重疊時,中心比較近的那一個接下這次按壓。
瀏海與鍵盤
HUD 零件待在安全區域內,虛擬鍵盤跳出來時輸入欄會升到它上面。
返回一次只關一層
Escape 與 Android 的返回鍵只關掉最上層那一層介面。疊在一起的視窗不會一起消失。
訊息條不會搶走輸入
按在訊息條上,底下的按鈕照樣收得到。焦點也不會被拿走。
圖示按名稱索取
控制項只認得 GoIconSet.CLOSE。換掉整組圖示,所有圖案都跟著換,一行程式碼都不必動。 圖示 →
十四種外觀,一行切換
GoUi.use_preset() 一次換掉佈景主題、外觀與圖示 — 圓角、切角的科幻、鍛造的中世紀框、Material 3 的應用元件、兒童的果凍糖、漫畫的墨線,或街機的彩漆。
清晰度是量出來的
每一份佈景主題都對照 WCAG 檢查過,包含按鈕的各種狀態,以及半透明 HUD 面板疊在純白與純黑上的情形。
安裝 gohud
兩條路:讓 AI 代理替你裝,或把資料夾放進專案 —— 此外不必設定任何東西。
快速上手
五行程式碼就能顯示帶佈景主題的畫面。完整流程請見安裝頁。
換外觀 — 顏色與形狀一起
Theme 只能重新樣式化引擎畫出來的東西。StyleBoxFlat 只有圓角這一種角, 而搖桿、快捷格與導覽標記是用程式碼畫的 — 光靠佈景主題永遠改不了它們的形狀。 所以 gohud 附上預設集:佈景主題、外觀與圖示組當成一個整體一起挑。
GoUi.use_preset(GoThemePresets.MEDIEVAL_DARK) # 佈景主題、外觀與圖示一起換
| 預設集 | 外觀 |
|---|---|
default_dark | 最初的 gohud — 圓角,柔和的藍色強調色 |
default_light | 同樣的形狀,換成淺色調色盤 |
scifi_dark | 切角,青色霓虹邊與光暈,六邊形搖桿,瞄準框角 |
scifi_light | 同樣稜角分明的形狀,換成明亮的藍圖調色盤 |
medieval_dark | 暗鐵與皮革、古金色框、鉚釘、雕刻圖示、Cinzel 標題 |
medieval_light | 羊皮紙、墨水與青銅,配上同樣的鍛造框 |
material_light 新 | 給應用畫面的 Material 3 — 膠囊按鈕、28dp 對話方塊、填色卡片、應用的導覽列、FAB 與搜尋列、Roboto |
material_dark 新 | 同樣的 Material 3 形狀,換成深色基準配色 |
kids_light 新 | 給孩子的玩具箱 — 帶粗描邊的果凍糖按鍵,下方一道底邊,按下時會陷進去;蠟筆色,陽光般明亮的頁面 |
kids_dark 新 | 同一個玩具箱,放在夜藍色的頁面上 |
comic_light 新 | 漫畫分鏡 — 每個表面都有粗墨線描邊與硬陰影,紙張般的奶油色頁面上放著白色面板;陰影、陰影大小與描邊粗細都是設定項 |
comic_dark 新 | 同樣的墨線,放在夜色頁面上 — 奶油色描邊與黃色主色 |
arcade_light 新 | 一台街機 — 每個按鍵都以漸層、高光與底邊上色,標籤是帶墨線描邊的白字;天藍色頁面上的厚外框面板,視窗有金色標題橫幅 |
arcade_dark 新 | 同樣鮮亮的按鍵,放在藏青色面板與夜色頁面上 |
default_dark — 圓角,柔和的藍色強調色
default_light — 同樣的形狀,淺色調色盤
scifi_dark — 切角,青色霓虹
scifi_light — 同樣稜角分明的形狀,藍圖調色盤這四張是同一個藝廊畫面。沒有一行程式碼不同 — 只有預設集的名稱不同。 按鈕圓角、切換開關的形狀、清單列與輸入框邊框全都一起改變。
中世紀系列
medieval_dark 把鐵與皮革配上古金色;medieval_light 用的是羊皮紙
與墨水。選單框上有一顆鉚釘和一小塊角落裝飾,而始終顯示的 HUD 保持安靜;
16 個雕刻圖示重畫了物品名稱,只有標題與副標題用到內附的 Cinzel 字型。
medieval_dark — 鐵與皮革
medieval_light — 羊皮紙與墨水兩張圖都是 examples/medieval/medieval.tscn,全部用標準控制項組成。
中世紀指南,以及怎麼打造自己的王國 →
同一個畫面,在手機與在桌機
藝廊那幾張是直向手機。下面是同樣的程式碼跑在 1280×800 — 內容停在好讀的寬度(480dp) 並置中,HUD 則待在角落。表單會繞開浮動的 HUD 零件,但在本來就沒擋到時不會移動: 硬推的話,寬螢幕上的內容就會歪掉。
default_dark · 1280×800
scifi_dark · 1280×800同一個面板,不同外觀
可以從 專案設定 → gohud → Theme → Preset 挑一個,或設定 GoConfig.preset。
明確填入 theme、skin 或 icons 會蓋過預設集,
所以你可以拿一個預設集來,只覆寫其中一項。
new_theme.py kingdom --from medieval_dark
會寫出一份把每個繼承值都寫清楚的調色盤;make_theme.py kingdom 接著產生佈景主題、
它的控制項圖檔與外觀旋鈕,這個預設集就會出現在選擇器裡。所有設定與旋鈕 →
外觀 — 佈景主題碰不到的地方
外觀掌管搖桿、快捷格的面、導覽標記的圈、標籤片、骨架佔位、行內提示、分隔線 與區段標題。繼承它,只覆寫你想改的部分。
class_name MySkin extends GoSkin
func slot_box(accent: Color, lit: bool) -> StyleBox:
var box := GoStyleBoxCut.new()
box.bg_color = accent
box.cut = 6.0
box.edge_color = accent
return box
| 類別 | 畫得出來的形狀 |
|---|---|
GoStyleBoxCut | 斜切的角(切角)、一道加粗的強調邊、外側光暈 |
GoStyleBoxBracket | 只有角落的記號,不把內容框起來 |
GoStyleBoxMedieval | 帶鉚釘、角落雕刻、斜角高光與材質紋理的鍛造框 |
GoStyleBoxJelly | 果凍糖 — 粗描邊、按下時會陷進去的實心底邊、上淺下深的糖體,以及一道白色高光 |
GoStyleBoxComic | 漫畫分鏡 — 粗墨線描邊與硬投影,兩者的大小都在遊戲執行時由 GoConfig 決定 |
GoStyleBoxArcade | 街機的按鍵或面板 — 漸層主體、白色高光、按下時會陷進去的底邊與墨線描邊;面板再加一圈厚厚的彩色外框圍著淺色內芯 |
這六種都能序列化進 Theme 資源 — 這正是佈景主題改得了形狀、而不只是顏色的原因。
GoSkinSciFi、GoSkinMedieval、GoSkinMaterial、GoSkinKids、GoSkinComic 與 GoSkinArcade 是內附的子類別。



GoStyle.box() 一律回傳 StyleBoxFlat,因為呼叫端拿到它之後
會去調整 bg_color 或 corner_radius。當自訂形狀必須保留時,
請改用 GoStyle.surface()。
控制項
所有零件,一張表看完。逐一細看 → · 每個控制項都附一張圖 → · 彈出視窗與對話方塊完整指南 →
| 類別 | 基底 | 功能 |
|---|---|---|
GoSurface | Control | 浮動卡片外殼 — 置中、靠下或錨定擺放,固定的頁首與頁尾,可捲動的本文,拖曳改變大小 |
GoSheet | CanvasLayer | 從底部升起的頁面,位於自己的圖層上,所以會蓋在 HUD 之上 |
GoDialogs | Node | 可以 await 的確認與提示;不可逆的動作用 destructive |
GoForm | MarginContainer | 限制寬度的表單,會避開虛擬鍵盤,加上 avoid_hud 還會避開 HUD |
GoScroll | ScrollContainer | 觸控捲動;捲軸縮進卡片的內距裡 |
GoNotice | PanelContainer | 既不吃輸入也不吃焦點的訊息條 |
GoPromptCard | PanelContainer | 不會擋住遊戲的提問卡 |
GoCoachMark | Control | 指向真實控制項的導覽;按下目標就前進到下一步 |
GoHudAnchor | Control | 把 HUD 零件釘在安全區域的九個位置之一 |
GoBar | Control | 生命、魔力與經驗量條,數值變化帶緩動 |
GoSlot | Button | 一格快捷格 — 圖示、數量、冷卻與快速鍵全在同一個面上 |
GoJoystick | Control | 固定、跟隨或相對模式的虛擬搖桿 |
GoIconButton | Button | 看起來小,按起來大 |
GoStyle | static | 按鈕、清單列、輸入欄、標籤片、表格、分頁等等,都用同一套一致的做法產生 |
等待、告知、計數
| 類別 | 基底 | 功能 |
|---|---|---|
GoSnackbar | Node | 會自己找位置的訊息 |
GoSpinner | Control | 看不到盡頭的等待 |
GoBadge | PanelContainer | 未讀圓點、「新」標籤、99+ |
表單與清單
| 類別 | 基底 | 功能 |
|---|---|---|
GoField | VBoxContainer | 會出錯的那一列 |
GoInputGroup | HBoxContainer | 和按鈕焊在一起的輸入欄 |
GoCombobox | Button | 會搜尋的選擇器 |
GoCodeInput | VBoxContainer | 優惠券與禮物碼 |
GoTable | VBoxContainer | 可排序的標題列、可選取的資料列 |
GoPagination | HBoxContainer | 頁碼,或是一列「更多」 |
遊戲真的會用到的形狀
| 類別 | 基底 | 功能 |
|---|---|---|
GoRewardCalendar | VBoxContainer | 每日簽到 |
GoRadar · GoDonut | Control | 一眼看完的能力值 |
GoCarousel | VBoxContainer | 橫幅與角色選擇 |
GoKbd | HBoxContainer | 不會說謊的按鍵提示 |
蓋在畫面上
| 類別 | 基底 | 功能 |
|---|---|---|
GoDrawer | CanvasLayer | 側邊面板 |
GoPopover | RefCounted | 釘住的卡片 |
GoContextMenu | RefCounted | 長按與右鍵 |
GoConsole | CanvasLayer | 開發者主控台 |
Go HUD Skill
gohud 內建 AI 技能:完整 API、可直接執行的範本與預覽啟動器。把下面這一段貼給你的編碼代理,它就會裝好 gohud 並知道怎麼用。
可讀性是量出來的,不是用眼睛估的
「好看」是品味;「看得清楚」量得出來。淺灰色的文字在好螢幕上看起來沒問題, 到了白天的手機上就消失 — 用眼睛挑,遲早會踩到這一步。
python3 addons/gohud/tools/check_contrast.py
十四種佈景主題中的每一組配色,以及每個按鈕狀態下的標籤與它所在的面板,都會對照 WCAG 量過。半透明的顏色會先合成到它真正的背景上 — 直接量它們,得到的比值會比畫面上看到的更好看。
所以文字顏色是推算出來的,不是挑出來的:產生器拿調色盤裡的值當起點, 把它的明度推到在每一個可能落腳的面板上都達標為止。改調色盤,對比就跟著走。 背後的規則與陷阱 →
檢查、發行與這個網站
一個進入點跑完所有檢查;每一部分都看得到別人看不到的東西。
bash addons/gohud/tools/check_all.sh
| 檢查 | 抓得到什麼 |
|---|---|
四種螢幕尺寸下的 run_tests.sh | 控制項行為與版面、RTL 位置、鍵盤焦點、執行時的外觀對比、每一種預設集 |
new_project_check.sh | 對宿主專案的隱藏相依;加上 --zip 檢查實際發行的內容,加上 --export 檢查 Web 建置 |
check_contrast.py | 每份佈景主題檔的 WCAG 對比,含按鈕狀態與半透明面板 |
check_generated.py · check_scaffold.sh | 產生的佈景主題與其調色盤相符;用完即丟的佈景主題能建置並通過對比檢查 |
check_package.py | 採用 package.json 的版本號、變更紀錄搬移與 ZIP 內容,全都在暫時的副本上進行 |
check_site.py | 這個網站的連結、錨點、頁面語言、詞彙表與旋鈕表格 |
發行版本
cat addons/gohud/package.json # { "version": "1.1.0" }
bash addons/gohud/tools/release.sh # 全部檢查 → ZIP → 在空專案中驗證
bash addons/gohud/tools/package.sh # 1.1.0 → builds/1.1.0/gohud-1.1.0.zip
版本就是 package.json 裡寫的那個,打包絕不會自動調高。
要發行新版本,先改這個數字。
成功執行時會把 plugin.cfg 與 GoUi.VERSION 設成該版本,且只在該版本第一次打包時,把 CHANGELOG.md 中 Unreleased 的內容搬進一筆有日期的紀錄。
同一版本再次打包會重新產生 ZIP 並取代舊的。執行失敗則什麼都不改。
ZIP 裡不含這個網站、測試、工具與 package.json。
這個網站
python3 addons/gohud/tools/make_site.py # 詞彙表與外觀旋鈕表格,從原始碼產生
python3 addons/gohud/tools/check_site.py # 連結、錨點、語言、詞彙表、產生的表格
bash addons/gohud/tools/site_shots.sh /tmp/shots # 每一頁的桌機與手機螢幕截圖
這些頁面就是 www/ 底下的純 HTML — 根目錄是英文,ko/ 是韓文。
一個 GitHub Actions 工作流程會把那個資料夾發佈成網站根目錄。