界面(.gui)入门
.gui 文件结构、常用元素、定位规则,修改原版界面的限制,以及 effectbuttonType 和事件 custom_gui
能改什么、不能改什么
群星的界面由 interface/*.gui 描述布局,interface/*.gfx 描述用到的图片(见 GFX、Sprite 与字体)。界面背后的逻辑是写死在引擎里的:
- 可以改原版元素的位置、尺寸、图片、字体,或把不要的元素藏起来;
- 不能凭空给原版窗口添加有功能的普通按钮——按钮的功能由引擎按元素
name绑定; - 想要“点一下执行脚本”的按钮,用
effectbuttonType(下文); - 想要一个自定义样式的窗口,用事件的
custom_gui(下文)。
注意 引擎按
name找元素。删除原版元素、改名、或调整容器的嵌套结构,轻则功能失效,重则崩溃。不想要的元素请把尺寸设为 0 或移到屏幕外,保留它的名字和位置层级。
文件结构
一个 .gui 文件包在 guiTypes = { } 里,下面是一层层嵌套的元素。原版 interface/pop_confirmation_dialog.gui(节选):
guiTypes = {
containerWindowType = {
name = "pop_confirmation_dialog"
position = { x = -200 y = -116 }
size = { width = 300 height = 200 }
moveable = yes
orientation = center
background = {
name = "background"
quadTextureSprite ="gfx_message_bg"
}
instantTextBoxType = {
name = "title"
font = "cg_16b"
position = { x = 10 y = 15 }
maxWidth = 280
maxHeight = 30
fixedSize = yes
format = center
}
buttonType = {
name = "AgreeButton"
quadTextureSprite = "GFX_button_animated_265_34"
position = { x = 5 y = 30 }
Orientation = "UPPER_LEFT"
buttonFont = "cg_16b"
shortcut = "RETURN"
clicksound = "confirm_click"
}
}
}原版里 orientation 和 Orientation 两种写法都有,看起来字段名不区分大小写;拿不准时照抄原版的写法。
常用元素
按原版 .gui 中的出现次数排列:
| 元素 | 用途 | 常用字段 |
|---|---|---|
containerWindowType | 容器、窗口 | position、size、moveable、clipping、background |
instantTextBoxType | 文字 | font、text、maxWidth、maxHeight、fixedSize、format |
iconType | 图片 | spriteType、frame、scale、centerPosition |
buttonType | 按钮(功能由引擎绑定) | quadTextureSprite 或 spriteType、buttonText、buttonFont、shortcut、clicksound |
gridBoxType | 网格排列子项 | slotsize、max_slots_horizontal、format |
smoothListboxType / listboxType | 可滚动列表 | spacing、scrollbartype |
scrollbarType、checkboxType、editBoxType、dropDownBoxType、spinnerType | 其他控件 | |
effectbuttonType | 执行脚本效果的按钮 | effect,见下文 |
提示文字用 pdx_tooltip = "<本地化键>"(原版大量使用)或 tooltipText。
定位
position = { x = … y = … }:相对父元素的偏移,整数,可为负。orientation:元素锚定在父元素的哪个点。原版用得最多的是upper_left、upper_right、center、lower_left、center_up、lower_right、center_down。origo:元素自身以哪个点对齐到上面的锚点,取值相同。例如orientation = lower_right加origo = lower_right再配负的position,就能贴着父元素右下角放置。size:可以写固定值,也可以写百分比,原版有size = { width = 100% height = 100% }。
原版还会在文件顶部用 @名字 = 数值 定义本文件内的常量,并用 if_resolution / if_scaled_resolution 针对不同分辨率换布局。
修改原版界面
.gui 的覆盖单位是整个文件:模组里放一个与原版同路径的文件,就会替换原版那份(见加载顺序与覆盖规则)。因此:
- 只复制你要改的那一个
.gui文件,不要整个interface/文件夹; - 改动尽量小,方便游戏更新后与新版原版文件对比;
- 两个模组改同一个
.gui必然冲突,只能二选一或做兼容补丁。
effectbuttonType:执行脚本的按钮
原版 common/button_effects/example.txt 说明了这个机制。界面里放一个 effectbuttonType,effect 指向 common/button_effects/ 里的定义:
example_button_effect = {
potential = {
always = no
}
allow = {
always = no
}
effect = {
add_monthly_resource_mult = {
resource = minerals
value = 5
min = 5
max = 500
}
}
}potential决定按钮是否显示,allow决定能否点击,effect是点击后执行的效果;- 作用域:
this是当前选中的对象(行星、舰船、舰队、星系、巨型建筑、联邦、考古遗址等)或玩家国家,from是玩家国家; - 示例文件建议在
allow里用is_scope_type = planet之类先确认作用域,因为同时打开多个界面时可能弄混。
原版舰队界面里的“成长”按钮就是这样做的(interface/fleet_view.gui):
effectbuttonType = {
name = "grow_button_effect"
position = { x = 79 y = 28 }
size = { x = 120 y = 20 }
quadTextureSprite = GFX_tiling_button_standard
font = "cg_16b"
buttonText = "GROW_UP"
tooltipText = "GROWTH_BUTTON_DESC"
delayedTooltipText = "GROWTH_BUTTON_DESC_DELAYED"
effect = grow_up_button_effect
clicksound = "ui_kaiju_grow_up"
}注意这仍然需要把按钮放进某个原版窗口的 .gui 里,也就是要覆盖那个文件。
事件的自定义窗口
外交类事件可以换用自定义窗口。原版 events/anomaly_events_4.txt:
country_event = {
id = anomaly.6815
title = anomaly.6815.name
desc = anomaly.6815.desc
is_triggered_only = yes
diplomatic = yes
custom_gui = "enclave_curator_window"
# ……
}custom_gui 的值是某个 .gui 里窗口的 name,原版这个窗口定义在 interface/diplomacy_curator_event_view.gui。做法是复制一个原版外交事件窗口,改名后调整外观;其中的子元素名字要与原版窗口保持一致,因为事件标题、正文、选项按钮是按名字填进去的。
调试
| 控制台命令 | 作用 |
|---|---|
reload_gui | 重新加载所有 GUI 文件并尝试重新打开当前界面 |
guibounds | 开关 GUI 边界显示,用来看清元素的范围 |
debugtooltip | 调试提示,见调试 |
gui_extra_height | 设置界面允许纵向扩展的像素数 |
改坏的 .gui 常常不会在 error.log 里留下清楚的报错,而是窗口错位或直接崩溃。每改一处就进游戏看一次,比一次改很多处更省时间。
部分内容改编自 Stellaris Wiki: Interface modding,按 CC BY-SA 3.0 授权。