gohud

三層

← 佈景主題

一個預設集把三層綁成一組。留空的欄位會退回使用預設值。

層決定什麼怎麼改
Theme 顏色、尺寸、文字比例,以及引擎畫出來的一切的形狀 — 按鈕面板、輸入欄、分頁、切換開關的圖檔 自己寫一份 .tres,或用 tools/make_theme.py 產生一份
GoSkin 程式碼畫出來的一切的形狀 — 搖桿、快捷格的面、導覽標記的圈、標籤片、骨架佔位、分隔線、區段標題 繼承它,只覆寫你在意的那幾個方法
GoIconSet 用名稱取用的圖示 — 84 張預設圖案,或中世紀組疊在上面的 16 張雕刻圖案。可以是材質包,也可以是圖示字型;呼叫端的程式碼兩種都一樣 換上一整組,或只覆寫其中幾個名稱
為什麼光有 Theme 不夠。StyleBoxFlat 只有圓角這一種角 — 把半徑設成零就變直角;中間什麼都沒有。斜切的角、單獨一道加粗的邊、外側的光暈:引擎一個都畫不出來。 而搖桿與導覽標記是在 _draw() 裡畫的,佈景主題根本伸不進去。

挑一個

GoUi.use_preset(GoThemePresets.SCIFI_DARK)

這一行就換掉佈景主題、外觀與圖示。從編輯器要挑的話,用 專案設定 → Gohud → Theme → Preset;從設定資源則是 GoConfig.preset。

只留一個欄位給自己

GoUi.use_preset(GoThemePresets.SCIFI_DARK)
GoUi.config.icons = my_icons     # 圖示用你的,其餘全部用預設集的

明確設定 theme、skin 或 icons 會蓋過預設集。

內建的十四種預設集

預設集面板外觀 · 圖示
default_dark · default_light圓角的 StyleBoxFlat 面板,搭配分級的陰影刻度;主要按鈕會浮起,按下時沉下去GoSkin · 84 個預設圖示
scifi_dark · scifi_light切角的 GoStyleBoxCut 面板,帶霓虹邊與光暈;焦點記號用 GoStyleBoxBracketGoSkinSciFi — 六邊形搖桿 · 預設圖示
medieval_dark · medieval_light鍛造的 GoStyleBoxMedieval 框 — 鐵與皮革,或羊皮紙 — 選單上還有鉚釘與角落裝飾GoSkinMedieval · 16 個雕刻圖示疊在預設之上
material_light · material_dark 新給應用畫面的 Material 3 Expressive — 48dp 觸控區裡 40dp 的膠囊按鈕、28dp 對話方塊、填色卡片、外框輸入欄、Expressive 滑桿;應用元件(導覽列、頂端應用列、FAB、搜尋列、方塊標籤、進度、日期選擇器)依循 M3 元件權杖GoSkinMaterial · 預設圖示
kids_light · kids_dark 新給兒童——玩具箱:粗描邊,每個按鍵下都有一道實心底邊,按下時會陷進去;凹陷的輸入框、泡泡分頁、果凍進度條;每類控制項各有一種蠟筆顏色,糖果般的快捷格、貼紙徽章、彩虹搖桿和蠟筆色圖表。尺寸和專案字型保持不變。GoSkinKids · 預設圖示
arcade_light · arcade_dark 新由 GoStyleBoxArcade 繪製的街機:每個按鍵都以由上到下的漸層、一道白色高光與按下時會陷進去的底邊上色,裝在藏青色的墨線描邊裡,標籤是帶墨線描邊的白字 — 主色綠色,按鍵藍色,危險紅色,小按鍵淡紫色。厚實的面板是一圈彩色外框圍著淺色內芯;視窗有金色標題橫幅與圓形的紅色關閉鍵。GoSkinArcade · 預設圖示
comic_light · comic_dark 新由 GoStyleBoxComic 繪製的漫畫分鏡:每個表面都有粗墨線描邊與硬陰影,按下時陰影消失;描了墨線的開關、核取方塊與滑桿把手,視窗有黃色的標題框。描邊粗細、陰影大小以及是否顯示陰影,都是 GoConfig 設定。GoSkinComic · 預設圖示

十四種並排比較

同一個藝廊畫面,只換了預設集的名稱 — 控制項的程式碼一行都沒變。 每張都是直拿的手機,390×844。

套用 default_dark 預設集的 gohud 控制項藝廊
default_dark
套用 default_light 預設集的 gohud 控制項藝廊
default_light
套用 scifi_dark 預設集的 gohud 控制項藝廊
scifi_dark
套用 scifi_light 預設集的 gohud 控制項藝廊
scifi_light
套用 medieval_dark 預設集的 gohud 控制項藝廊
medieval_dark
套用 medieval_light 預設集的 gohud 控制項藝廊
medieval_light
套用 material_light 預設集的 gohud 控制項藝廊
material_light
套用 material_dark 預設集的 gohud 控制項藝廊
material_dark
套用 kids_light 預設集的 gohud 控制項藝廊
kids_light
套用 kids_dark 預設集的 gohud 控制項藝廊
kids_dark
套用 comic_light 預設集的 gohud 控制項藝廊
comic_light
套用 comic_dark 預設集的 gohud 控制項藝廊
comic_dark
套用 arcade_light 預設集的 gohud 控制項藝廊
arcade_light
套用 arcade_dark 預設集的 gohud 控制項藝廊
arcade_dark

中世紀:鐵、皮革與羊皮紙

medieval_dark 把暗鐵與皮革配上古金色。medieval_light 用的是羊皮紙與墨水。兩者都用 GoSkinMedieval、現有的控制項,以及 16 個帶雕刻細節的 原創圖示;導覽類圖示則退回使用原本那一組。

GoUi.use_preset(GoThemePresets.MEDIEVAL_DARK)
# 或:GoUi.use_preset(GoThemePresets.MEDIEVAL_LIGHT)

要在建立 UI 之前挑好預設集。明確指定的 GoConfig.theme、 skin 或 icons 依然優先。開啟 res://addons/gohud/examples/medieval/medieval.tscn 並按 F6,就能看到可運作的 角色面板、行囊與任務日誌。裡面的按鈕會切換變體,也會打開物品細節。

中世紀鐵風格的角色、背包與任務介面
鐵與皮革
中世紀羊皮紙風格的角色、背包與任務介面
羊皮紙與墨水

選單框上有一顆鉚釘與一小塊角落裝飾;始終顯示的 HUD 則保持安靜的邊。 生命、魔力與體力分別用紅、藍與橄欖綠填色。Cinzel 只用在標題與副標題; 內文文字維持宿主/預設字型。內附字型的授權放在 assets/fonts/cinzel/OFL.txt。

雕刻組重畫了 bag、book、box、coin、crown、 flag、heart、key、map、potion、shield、 star、sword 與 user,另外加上 scroll 與 seal。 其他每一個名稱都退回預設組,所以 close 與 settings 在每一種預設集裡都維持原本的 圖案。Cinzel 只涵蓋拉丁字母;在地化的標題請透過 shape.fonts 指定自己的字型。

測試套件對兩種變體檢查了什麼。中世紀外觀有被選用;選單與 HUD 面板是鍛造框,而裝飾只出現在選單上; 標題使用 Cinzel,內文則沿用繼承來的字型;雕刻圖示以 DPITexture 匯入;實際的快捷格有用到該外觀; 改動複製出來的外觀的旋鈕,效果會傳到快捷格而不必更動預設集;切換回去時,預設與科幻的幾何形狀都能復原。

打造一個自己的王國

python3 addons/gohud/tools/new_theme.py kingdom --from medieval_dark
# 編輯 themes/palettes/kingdom.json,然後:
python3 addons/gohud/tools/make_theme.py kingdom
godot --headless --path . --import
# 在 GDScript 中,建立控制項之前:
GoUi.use_preset(&"kingdom")

JSON 佈景主題可以繼承其他 JSON 佈景主題。省略的值沿用上層的設定; 循環繼承會被拒絕。產生出來的預設集會保留上層的圖示組。

設定效果
shape.material0:鐵 · 1:皮革 · 2:羊皮紙。控制表面的紋路。
shape.grain_alpha紋理的不透明度。想要乾淨的表面就設成 0。
shape.ornament_scale · shape.bevel_strength選單角落裝飾的大小,以及斜角高光的強度。
shape.fonts把 title、subtitle、caption、body 與 button 這幾個角色對應到附加元件本地的 res:// 字型檔。省略的角色沿用繼承來的字型。
skin.dials快捷格圓角、鉚釘顯示與否、紋理與高光。下面的完整表格列出每一個旋鈕。

Material 3:給應用畫面的外觀 新

material_light 與 material_dark 把 Material 3 Expressive 帶進 gohud — M3 元件的形狀、尺寸與 字體排印,每一個數值都讀自官方的 M3 權杖集(material-web, tokens/versions/latest)。當某個畫面應該讓人覺得像應用程式、而不是遊戲選單時,就用它們: 商店、收件匣、帳號與設定頁面、排行榜、配套應用程式。

GoUi.use_preset(GoThemePresets.MATERIAL_LIGHT)
# 或:GoUi.use_preset(GoThemePresets.MATERIAL_DARK)
material_light 下的 gohud 藝廊 — 膠囊按鈕、填色卡片與外框輸入欄
material_light
material_dark 下的 gohud 藝廊
material_dark
material_light 下蓋在遊戲上的確認對話方塊 — 28dp 圓角與膠囊按鈕
GoDialogs · material_light
material_dark 下蓋在遊戲上的確認對話方塊
GoDialogs · material_dark

改了什麼

部分在 Material 3 裡
按鈕膠囊形(全圓角)。底板高 40dp,置中放在 48dp 的觸控目標裡,所以按壓範圍並不會縮小;緊湊按鈕的底板是 32dp。標籤使用字重 500 的 Roboto。
對話方塊與底部面板28dp 圓角(extra-large)、24dp 內距與 24sp 的標題 — GoDialogs、GoSurface、GoSheet,以及建立在它們之上的每一種彈出視窗。
卡片12dp 圓角、16dp 內距的填色卡片。
輸入欄與滑桿外框輸入欄;把手較高的 Expressive 滑桿。
方塊標籤與區段按鈕8dp 圓角(small)。
應用元件GoNavBar、GoAppBar、GoFab、GoSearchBar、方塊標籤、GoProgress 與 GoDatePicker 依循 M3 元件權杖。
字型標題、副標題、說明文字與按鈕使用內附的 Roboto。內文保留你專案的字型,所以韓文、日文、中文或阿拉伯文照樣畫得出來。
不透明度每塊面板都不透明 — M3 的表面是實心的。(預設、科幻與中世紀的面板是 80% 不透明,所以遊戲會透出來。)
外觀GoSkinMaterial:抽屜是 M3 的強制回應側邊面板,主控台的表面是 M3 的浮動工具列,橫幅放在 surface_container_low 上。
規格向可讀性讓步的地方。M3 把停用狀態的標籤淡化到 38%;gohud 把它維持在 4.5:1,讓它依然讀得清楚。 訊息條保留淺色底板,因為它的文字顏色是控制項自己挑的權杖 — 換成反色底板,就會變成深色文字壓在深色底上。 tools/check_contrast.py 會像量其他外觀一樣量這兩種外觀。

Roboto 採用 SIL Open Font License 1.1 授權(assets/fonts/roboto/OFL.txt),只供 Material 預設集使用。

兒童:玩具箱 新

kids_light(奶油色與蜜桃色,主色是葡萄紫)與 kids_dark(藍莓色底、陽光黃主色、 薄荷色膠囊)是為兒童遊戲與學習應用程式打造的外觀 — 厚實、明亮、軟 Q,正是小小手指忍不住想按的那種東西。

GoUi.use_preset(&"kids_light")
# 或:GoUi.use_preset(&"kids_dark")
kids_light 下的 gohud 藝廊 — 蠟筆色的果凍糖按鈕
kids_light
kids_dark 下的 gohud 藝廊 — 夜藍色頁面上的玩具箱
kids_dark
kids_light 下的確認對話方塊 — 陽光色的標題緞帶與圓形的糖果關閉按鈕
GoDialogs · kids_light
kids_dark 下的確認對話方塊 — 薄荷色的標題緞帶與糖果關閉按鈕
GoDialogs · kids_dark

改了什麼

部分在兒童外觀裡
每個表面一顆果凍糖,由 GoStyleBoxJelly 繪製:粗描邊、每個可按之物下方的一道實心底邊、上淺下深的糖體,以及左上角的一道白色高光。按鍵、清單列、摺疊標題、輸入欄、量條、滑桿與面板全都用它。
按下底邊消失,表面沉到底邊的位置,接著是一下果凍般的壓扁 — 先短暫地變寬變扁,再有彈性地彈回來。gohud 建立的每顆按鈕都有這個效果;reduce_motion 會把它關掉。
輸入欄、分頁、量條輸入欄是同一種果凍往內凹的樣子 — 一個下陷的凹槽。分頁是泡泡,量條帶果凍般的高光。
顏色每類控制項各有自己的蠟筆顏色,由和所有外觀相同的產生器挑選,所以每一道對比度檢查依然成立。
視窗視窗標題後面一條陽光色的緞帶(夜間是薄荷色)— 標題會縮小(最小到 15)以保持在一行內 — 以及一顆用危險色蠟筆畫成、帶白色叉號的圓形糖果關閉按鈕。
外觀部件GoSkinKids:快捷格是冷卻時會下陷的糖果方塊,徽章是貼紙,方塊標籤與導覽膠囊是小果凍,頭像是圓糖果,搖桿是一道彩虹,圖表用蠟筆色,警示與提示是帶實心邊框的貼紙便條。
不透明度面板、卡片、提示與彈出視窗都不透明。
尺寸不變。描邊與底邊都畫在每個控制項自己的矩形之內,每個表面也保留佈景主題給它的內距,所以在別的外觀下 排好的畫面會維持原本的版面,自己固定尺寸的宿主專案量到的也還是同樣的部件。你專案的字型同樣保留, 所以非拉丁文字照樣畫得出來。
每一種外觀下的快捷格、搖桿與方塊標籤 — 預設、兒童、Material、中世紀與科幻
外觀畫出的部分 — 第二列是兒童外觀

打造一個自己的玩具箱

python3 addons/gohud/tools/new_theme.py candy --from kids_light
# 編輯 themes/palettes/candy.json,然後:
python3 addons/gohud/tools/make_theme.py candy
GoUi.use_preset(&"candy")

漫畫:粗墨線 新

comic_light(紙張般的奶油色頁面上放白色面板,主色是鈷藍)與 comic_dark(夜色頁面上的石板色面板、 奶油色描邊、黃色主色)把每個表面都畫成一格漫畫分鏡 — 粗墨線描邊,背後襯一道硬陰影。

GoUi.use_preset(&"comic_light")
# 或:GoUi.use_preset(&"comic_dark")
comic_light 下的 gohud 藝廊 — 帶硬陰影的墨線按鍵、清單列與量條
comic_light
comic_dark 下的 gohud 藝廊 — 夜色頁面上的奶油色墨線
comic_dark
comic_light 下的確認對話方塊 — 黃色的標題框與描了墨線的圓形關閉按鈕
GoDialogs · comic_light
comic_dark 下的確認對話方塊 — 石板色卡片上的黃色標題框
GoDialogs · comic_dark

改了什麼

部分在漫畫外觀裡
每個表面由 GoStyleBoxComic 繪製:墨色的粗描邊裡填著表面顏色,往右下方投出一道硬陰影。按鍵、清單列、輸入欄、分頁、量條、滑桿、面板與彈出視窗全都用它。
按下陰影消失,表面沉到陰影的位置。
控制項開關、核取方塊、選項按鈕與滑桿把手也都描了墨線,各帶一道小陰影。
視窗視窗標題後面一個黃色的標題框,以及一顆描了墨線的圓形關閉按鈕。
外觀部件GoSkinComic:快捷格、方塊標籤、徽章、頭像、提示、導覽列、FAB 與日期格子都描了墨線;搖桿的握把會投下陰影;圖表用醒目的原色。
不透明度面板、卡片、提示與彈出視窗都不透明;HUD 卡片為 92% 不透明。

墨線與陰影設定

三個 GoConfig 設定會一次改變所有漫畫表面。不需要重建任何東西 — 設定的同時畫面就會重畫。

GoUi.config.comic_border_width = 2.0   # 描邊(dp)— 預設 3
GoUi.config.comic_shadow_size = 6.0    # 陰影(dp)— 預設 4
GoUi.config.comic_shadow = false       # 所有地方都不要陰影

單一控制項可以不管設定,自行其是:

GoStyle.comic_shadow(skip_button, false)     # 這顆按鈕平貼著
GoStyle.comic_shadow(card, true, true)       # 這張卡片與其中的一切保留陰影
GoStyle.comic_border(title, 5.0)             # 只給這一個加粗描邊
尺寸不變。描邊與陰影都畫在每個控制項自己的矩形之內,每個表面也保留佈景主題給它的內距,所以在別的外觀下 排好的畫面會維持原本的版面。你專案的字型同樣保留。
漫畫外觀畫出的快捷格、搖桿與方塊標籤
漫畫外觀畫出的部分

打造一個自己的漫畫外觀

python3 addons/gohud/tools/new_theme.py inked --from comic_light
# 編輯 themes/palettes/inked.json,然後:
python3 addons/gohud/tools/make_theme.py inked
GoUi.use_preset(&"inked")

街機:上色的按鍵與厚實的面板 新

arcade_light(天藍色頁面上的白色面板)與 arcade_dark(夜色頁面上的藏青色面板) 把每個畫面都打扮成一台街機:每個按鍵都上了色 — 從淺色頂端過渡到深色底部的漸層、一道白色高光與按下時會陷進去的底邊, 裝在藏青色的墨線描邊裡 — 而且每塊面板都很厚,一圈彩色外框圍著淺色內芯。

GoUi.use_preset(&"arcade_light")
# 或:GoUi.use_preset(&"arcade_dark")
arcade_light 下的 gohud 藝廊 — 天藍色頁面上,綠、藍、紅、淡紫色的上色按鍵與藍色外框的 HUD 面板
arcade_light
arcade_dark 下的 gohud 藝廊 — 同樣鮮亮的按鍵,放在夜色頁面上
arcade_dark
arcade_light 下的確認對話方塊 — 帶外框的面板上,金色標題橫幅、圓形紅色關閉鍵,以及藍色與綠色的上色按鍵
GoDialogs · arcade_light
arcade_dark 下的確認對話方塊 — 藏青色面板上的金色橫幅
GoDialogs · arcade_dark

改了什麼

部分在街機外觀裡
按鍵由 GoStyleBoxArcade 繪製:漸層主體、繞著左上角的一道白色高光、顏色更深的底邊與藏青色墨線描邊。主要按鍵是綠色,一般按鍵與選中的分頁是藍色,危險按鍵是珊瑚色與紅色,小按鍵與其餘分頁是淡紫色。
標籤每個上色按鍵上都是帶墨線描邊的白字。每種顏色都會被調整,直到標籤在漸層的每個高度上都看得清 — 像 WCAG 一樣把描邊算作字母的一部分,達到 4.6:1 或更高。
按下底邊消失,按鍵陷進原位,再彈回來。
面板面板、卡片、HUD 卡片與彈出視窗都很厚:一圈自帶高光與底邊的彩色外框(視窗 6dp,卡片與 HUD 卡片 4,選單與提示 3),圍著一個帶墨線的淺色內芯。為了容納外框,內距會稍微加大,文字永遠不會碰到外框。
輸入欄與量條輸入欄與量條的凹槽是凹陷的內芯;量條的填色是一根帶高光的上色管,用的是它那種顏色的明亮填色。
視窗一條金色橫幅,上面是帶墨線描邊的白色標題,以及一顆畫著白色叉號的圓形紅色關閉鍵。
外觀部件GoSkinArcade:快捷格與方塊標籤是鍵帽,冷卻中的格子亮起金邊,徽章是淺色牌子,提示框圍著各自顏色的外框,選中的卡片亮起金邊,FAB 是金色按鍵,搖桿是有四個箭頭的高光底盤。
不透明度面板、卡片、提示與彈出視窗都不透明;HUD 卡片為 94% 不透明。

替單一按鍵上自己的顏色

佈景主題依種類替按鍵上色。如果選單裡每個按鍵都想要自己的顏色,就一個一個上色 — 懸停時的表面會稍亮一點, 按下時稍深一點,停用時維持暗淡:

menu.add_child(GoStyle.arcade_paint(GoStyle.button("Resume", _resume, GoStyle.Tone.PRIMARY), Color("#4ACB3E")))
menu.add_child(GoStyle.arcade_paint(GoStyle.button("Shop", _shop), Color("#FF8A1E")))
GoStyle.arcade_paint(stage_card, Color("#E3343D"), true)   # 面板的外框,以及其中的每個按鍵
標籤總是看得清。如果白色標籤在某種顏色上看不清,這種顏色就會被調亮或調深,直到看得清為止,所以你傳入的顏色 只是一個起點。在其他外觀下,arcade_paint() 什麼也不做。
按鍵大小不變。底邊與高光都畫在每個按鍵自己的矩形之內,所以在別的外觀下排好的畫面會維持原本的版面。 面板會給內容多留一點內距(卡片與 HUD 卡片 12dp,底部 15),讓文字不碰到外框。你專案的字型同樣保留。
街機外觀畫出的快捷格、搖桿與方塊標籤 — 帶高光的鍵帽與一個有四個箭頭的底盤
街機外觀畫出的部分

打造一個自己的街機外觀

python3 addons/gohud/tools/new_theme.py cabinet --from arcade_light
# 編輯 themes/palettes/cabinet.json — *_vivid 顏色就是上色用的顏色 — 然後:
python3 addons/gohud/tools/make_theme.py cabinet
GoUi.use_preset(&"cabinet")