从前加一套主题意味着手工改四个地方 —— 生成器的调色板、形状、一份皮肤、一份预设资源。 现在一条命令就把它们全部就位。
python3 addons/gohud/tools/new_theme.py neon --from scifi_dark --title "Neon"
python3 addons/gohud/tools/make_theme.py neon # 主题 .tres + 控件贴图
godot --headless --path . --import # 把新贴图导入一次
GoUi.use_preset(&"neon") # 完成 —— 它也会出现在选择器里
第一行会写出 themes/palettes/neon.json 和 themes/presets/neon.tres。
这份 JSON 会把所继承主题的每一个值都完整列出来,因此它同时也是一份“能改什么”的清单:
删掉一个键就沿用父主题的值,写上一个键就覆盖它。预设是通过扫描
themes/presets/ 找到的,所以不必改任何注册表代码 —— 项目设置里的下拉框也会自动认出它。
能改什么 —— 一页看完
| 位置 | 改什么 | 怎么写 |
|---|---|---|
from | 父主题 | dark · light · scifi_dark · medieval_dark · … 或者另一份 JSON 主题。省略的键继承它的值;继承成环会失败 |
palette | 背景 · 三层表面 · 边框 · 三级文字 · 强调色 · 四种状态色 · 遮罩 · 阴影 · 状态条底槽 | "#RRGGBB",带透明度写成 "#RRGGBB@0.35" |
仅用于填充的鲜艳色 *_vivid | 即使文字颜色不得不压暗,状态条也保持饱和 —— 漏写一个,生成器会告诉你 | |
| 可读性 | 不需要手工调。 文字、边框、强调色以及压在它上面的文字,都由生成器推到达标为止 —— 你只改强调色,检查照样能过 | |
shape | kind | flat(圆角) · cut(切角) · medieval(锻造边框) |
| 尺寸 | radius · radius_small · radius_large · gap · gap_small · gap_large · padding · button_height · button_padding[4] —— 令牌会跟着走,所以面板和控件内部的计算永远不会对不上 | |
仅 cut | cut_ratio · cut_max · corners(diagonal|all) · glow · edge | |
仅 medieval | material(0 铁 · 1 皮革 · 2 羊皮纸) · grain_alpha · ornament_scale · bevel_strength · fonts —— 把 title、subtitle、caption、body、button 映射到插件内的 res:// 字体文件 | |
skin | base —— 代码自绘之处(摇杆、快捷槽、角标、引导标记光圈、标签片、分隔线)所属的家族 | default · scifi · medieval |
dials —— 这些地方的数值:快捷槽边框宽度和着色、角标内边距、标签片和提醒的不透明度、摇杆圆环的宽度和不透明度、科幻切角尺寸、辉光与角标记 | 父主题的每个值都在 JSON 里写全了。生成器把它们写进 themes/skins/gohud_skin_<id>.tres —— 完全不碰皮肤代码。只有想改画法本身时才需要跑 --new-skin,它会搭出一个 GoSkin 子类的骨架 | |
icons | 图标集 | 指向某个 GoIconSet 资源的 res:// 路径 —— 省略时沿用 JSON 父主题的图标集 |
dark · title | 选择器里怎么显示它 | 布尔值 · 字符串 |
全部旋钮
下面这张表由 tools/make_site.py 直接从皮肤脚本的
@export 行生成 —— 加一个旋钮或改一个默认值,表格自动跟上。在 JSON 的
skin.dials 下就用这些名字。默认值写成 14 的是整数,写成
10.0 的是浮点数 —— JSON 里两种写法都行,生成器会转换成脚本里的类型。
默认皮肤 GoSkin — 17
| 旋钮 | 默认值 | 它设定什么 |
|---|---|---|
chip_fill_alpha | 0.16 | 标签片面板填充的不透明度。 |
chip_edge_alpha | 0.45 | 标签片面板边缘的不透明度。 |
alert_tint | 0.1 | 提醒框的面板向它的状态色偏移多少。 |
slot_tint_lit | 0.24 | 冷却进行中的快捷槽面板带多少强调色。 |
slot_tint_idle | 0.08 | 空闲状态下快捷槽面板带多少强调色。 |
slot_border_lit | 2 | 冷却进行中的快捷槽边框宽度(dp)。 |
slot_border_idle | 1 | 空闲状态下快捷槽的边框宽度(dp)。 |
badge_pad_x | 5 | 角标(数量、剩余时间)的水平内边距(dp)。 |
badge_pad_y | 1 | 角标的垂直内边距(dp)。 |
badge_edge_alpha | 0.6 | 角标面板边缘的不透明度。 |
float_shadow_alpha | 0.45 | 浮动卡片(引导标记、提示卡片)的阴影不透明度。 |
float_shadow_size | 14 | 浮动卡片的阴影模糊半径(dp)。 |
float_shadow_lift | 4 | 浮动卡片阴影向下的偏移量(dp)。 |
float_glow_size | 10.0 | 以发光代替投影的浮动面板(例如科幻切角面板)的辉光扩散距离(dp)。 |
joystick_base_alpha | 0.42 | 摇杆底盘的不透明度。 |
joystick_ring_alpha | 0.45 | 摇杆圆环的不透明度。 |
joystick_ring_width | 2.0 | 摇杆圆环的宽度(dp)。 |
科幻皮肤 GoSkinSciFi — 10
| 旋钮 | 默认值 | 它设定什么 |
|---|---|---|
cut_chip | 7.0 | 标签片面板的切角大小(dp)。 |
cut_skeleton | 5.0 | 骨架屏面板的切角大小(dp)。 |
cut_alert | 8.0 | 提醒框的切角大小(dp)。 |
cut_segment | 8.0 | 分段控件的切角大小(dp)。 |
cut_slot | 6.0 | 快捷槽面板的切角大小(dp)。 |
cut_disc_ratio | 0.24 | 头像和圆盘的切角 = 直径 × 这个比例。 |
slot_glow_alpha | 0.45 | 冷却进行中的快捷槽的辉光不透明度。 |
slot_glow_size | 6.0 | 冷却进行中的快捷槽的辉光扩散距离(dp)。 |
bracket_arm | 12.0 | 引导标记瞄准框的边臂长度(dp)。 |
bracket_thickness | 2.0 | 引导标记瞄准框的线条粗细(dp)。 |
中世纪皮肤 GoSkinMedieval — 5
| 旋钮 | 默认值 | 它设定什么 |
|---|---|---|
slot_radius | 4.0 | 中世纪快捷槽边框的圆角半径(dp)。 |
leather_grain_alpha | 0.035 | 快捷槽内部那层淡淡皮革纹路的不透明度。 |
ornament_scale | 1.0 | 快捷槽四角金属装饰的缩放。菜单边框用的是 shape.ornament_scale。 |
bevel_strength | 0.18 | 快捷槽边缘金属高光的强度。 |
slot_rivets | 1 | 是否在快捷槽上显示小金属铆钉:0 隐藏,1 显示。 |
继承皮肤(可选)
只有主题和形状够不着的东西 —— 摇杆的六边形、快捷槽角标、引导标记的瞄准框 ——
才住在皮肤里。继承 GoSkin,只重写那几个方法,再把 JSON 的
skin 指向那份资源。只改颜色的主题可以跳过这一步。
有一项检查在替这个承诺兜底。
tools/check_scaffold.sh 每次运行都会造一套一次性主题 ——
改掉强调色、把圆角设成 4 —— 并验证生成、令牌传播和对比度全过之后再把它删掉。
第一次运行就发现:一套只改了强调色的主题竟有 8 对颜色不达标 ——
生成器推高了文字颜色,却原封不动地用了强调色。现在它连强调色和压在上面的文字也一起推。