Godot UI 是一套面向 Godot 4.x 的界面设计技能,核心目标是从布局规则、可复用视觉资源和明确的交互状态出发构建 Control 界面,避免用一堆坐标去解决响应式问题,也避免让指针输入成为唯一可用路径。
用途 用于设计、实现和排查 Godot 4.x 的响应式 Control 界面。适用于需要适配多种窗口尺寸、宽高比、UI 缩放范围、输入设备、语言区域和无障碍选项的游戏 UI 工作。
主要能力
- 编辑前检查:定位 project.godot 并确认项目根目录,读取 config/features、显示基准尺寸、拉伸模式与宽高比、GUI 主题设置、本地化设置和 Input Map 动作;用项目既定的 Godot 可执行文件运行 --version,并依据该确切 4.x 版本的 API 与 Inspector 属性名工作。
- 检查代表性 UI 场景与脚本,记录根节点类型、CanvasLayer 使用、锚点与容器模式、size flags、唯一节点名、信号连接风格、类型化 GDScript 约定、场景构成与命名。
- 检查既有 .tres 主题、字体、字体回退、图标、本地化文件、UI 缩放设置及已定义的交互状态。
- 在预期设计尺寸、最小支持尺寸、最大实用尺寸和非常规宽高比下运行当前 UI;若存在翻译,至少测试一种较长的语言区域。
- 无鼠标导航测试:记录初始焦点、Tab 顺序、方向邻居、接受/取消行为、焦点可见性,以及会困住或丢失焦点的控件。
核心布局规则 Control 根节点跟随其视口或 UI 区域;用锚点放置相对于父节点的主要区域;用容器在区域内排列动态子节点。让容器掌管其直接子节点的位置和大小,通过 size flags、拉伸比例、最小尺寸、主题间距和包装控件来调整,而不是用偏移量对抗容器。使用 MarginContainer 做内边距、PanelContainer 作带样式的表面、box 容器作行列、GridContainer 作已知列数;当有效内容可能超出可用空间时使用 ScrollContainer,而不是把文字和控件压缩到勉强放下。屏幕空间游戏 UI 需独立于世界相机时放在 CanvasLayer 下。
工作流程 先定义支持的窗口尺寸、宽高比、UI 缩放范围、输入设备、语言区域和无障碍选项;再在选节点类型前勾画语义区域和阅读顺序;用锚点和容器加占位内容搭建结构树,先让缩放生效再美化;添加标签、字段、按钮、列表、图片和动态内容,使用有意义的命名和可复用子场景;在合理的最上层根节点应用共享 Theme,用类型变体区分主操作、破坏性、紧凑、标题等角色,仅对真正例外做逐节点覆盖;连接 pressed、value_changed、item_selected、text_submitted 等语义信号,仅当标准控件无法表达自定义交互时才用 _gui_input;为每个屏幕和模态框定义焦点入口、顺序、方向移动、激活、取消行为和焦点恢复;补充无障碍支持,包括持久标签、可见焦点、足够对比度、非颜色线索、可缩放文本、减少动态、可重映射控件和可读的状态/错误反馈;最后联合验证布局、主题状态、输入路径、本地化和运行时更新。
输入与焦点约定 只给可交互控件焦点;确认自定义控件使用合适的 focus_mode。屏幕可见后分配初始焦点,关闭对话框或子屏幕后把焦点还给打开者。除非项目有意重映射,保留内置 ui_* 动作语义,并将游戏操作与 UI 导航分开。确保键盘和手柄用户能到达每个操作并离开每个复合控件。焦点指示器要与悬停、按下状态视觉上可区分。尽量让标准控件处理文本编辑、选择、剪贴板、输入法和辅助语义。装饰性覆盖层用合适的 mouse_filter 避免挡住下方控件。取消/返回在所属屏幕或导航层处理,而非每个子节点各自处理。
类型化响应式示例 以下示例根据实际可用宽度在单列与双列间切换表单网格,而不是猜测设备类型:
extends Control
@export_range(320.0, 1600.0, 8.0) var compact_width: float = 720.0 @onready var settings_grid: GridContainer = %SettingsGrid
func _ready() -> void: resized.connect(_refresh_layout) _refresh_layout()
func _refresh_layout() -> void: settings_grid.columns = 1 if size.x < compact_width else 2
优先使用能通过容器自然重排的布局;仅当信息结构在受约束宽度下确实改变时,才加断点脚本。
验证 用匹配的编辑器导入并解析;支持时运行 <godot> --headless --path <project> --editor --quit 并检查全部输出。在支持范围内连续调整尺寸,测试横屏、竖屏、超宽、窄屏和高 DPI 场景;检查裁剪、重叠、零尺寸控件、多余滚动条、过多空白、纹理变形和内容溢出面板。替换为长文本、多行文本、空文本、大数字、支持时的从右到左文本及运行时生成内容;增大 UI 或内容缩放并确认布局重排而非裁剪。测试每个控件状态:正常、悬停、按下、聚焦、禁用、选中、无效、加载和适用的空状态。在全新屏幕上仅用 Tab 与 Shift+Tab、仅用方向操作、仅用接受/取消以及受支持手柄导航;在控件重叠或位于游戏画面之上时测试鼠标、触摸和键盘事件传播;验证焦点进入模态框、必要时停留在内、返回打开者并在场景切换后仍可见。检查对比度、焦点线索、非颜色状态指示、减少动态行为、文本替代和错误播报,且以确切引擎/平台支持为准。运行集成场景而非仅孤立组件,并报告任何未测试的设备、语言区域或辅助技术行为。
限制与注意事项 未提供具体收费、价格或平台支持范围信息。文中提到并非所有 Godot 4.x 版本都暴露相同的原生无障碍 API,需检查确切版本并在每个目标平台验证。应避免的陷阱包括:在容器直接子节点上设置偏移量、对列表或表单每项都用锚点、用缩放让 Control 适配而模糊画面、硬编码单一分辨率或标签长度或字体度量或输入设备、用大量主题覆盖掩盖设计系统、省略焦点样式或使焦点与悬停相同、在隐藏屏幕可见前抓取焦点或从不分配初始焦点、在 _input 中处理标准按钮激活、让 MOUSE_FILTER_STOP 的装饰控件挡住按钮、每次按键都重写 LineEdit.text 而不保留光标选择粘贴和输入法行为、仅用工具提示或颜色解释控件或错误、假定所有 4.x 版本都有相同原生无障碍 API。资料参考涵盖响应式布局、主题与视觉状态、输入焦点与无障碍。