com um clique
godot-ui-designer
Godot UI界面系统开发专家,支持自然语言描述自动创建菜单、HUD、对话框、响应式布局等完整UI系统
Instalar com Codex ou Claude Copie este prompt, cole no Codex, Claude ou outro assistente e deixe que ele revise a página da skill e instale para você.
Menu
Godot UI界面系统开发专家,支持自然语言描述自动创建菜单、HUD、对话框、响应式布局等完整UI系统
Instalar com Codex ou Claude Copie este prompt, cole no Codex, Claude ou outro assistente e deixe que ele revise a página da skill e instale para você.
Baseado na classificação ocupacional SOC
Godot技能统一入口,根据用户需求智能选择并调用最适合的Godot子技能,提供15个专业技能的一站式开发体验
为中文开发者提供完整的项目本地化、环境配置和开发工作流指导,确保中英文双语环境下的最佳开发体验
自动使用Context7进行文档研究,当用户需要代码生成、配置步骤或库/API文档时无需明确请求即可自动获取最新信息
GDScript 语法权威指南,提供最新 Godot 4.5 语法规范、最佳实践、缩进规则和代码风格
Godot 资源与动画创建专家,支持自然语言描述自动完成精灵导入、动画配置、特效制作、音效集成等资源工作
提供批量操作Godot节点的能力,支持批量更新属性、重命名、删除和创建节点,大幅提升开发效率
| name | godot-ui-designer |
| description | Godot UI界面系统开发专家,支持自然语言描述自动创建菜单、HUD、对话框、响应式布局等完整UI系统 |
重要提示: 本技能的所有代码示例均基于 Godot 4.5 最佳实践,使用 GDScript 语法。 确保在 Godot 4.x 环境中使用,特别注意 Control 节点和信号系统的新特性。
godot-ui-designer 是专门用于 Godot 游戏UI界面系统开发的智能化技能,能够根据用户的自然语言描述自动创建完整的用户界面系统,包括主菜单、游戏内HUD、设置界面、对话框、响应式布局等。
用户: "我需要一个像王者荣耀那样的游戏HUD,包含血条、蓝条、技能栏和地图"
系统: 自动实现:
- 顶部血条和蓝条显示
- 底部技能栏(4-6个技能)
- 右上角小地图系统
- 左上角角色信息和等级
- 击杀信息和连击提示
用户: "创建一个现代化的游戏主菜单,有背景动画和音效"
系统: 智能生成:
- 动态背景效果
- 渐显式菜单选项
- 悬停和点击动画
- 设置和关于对话框
- 背景音乐和音效集成
用户: "做一个完整的设置界面,包含图形、音频、控制和游戏设置"
系统: 全面开发:
- 图形设置(分辨率、全屏、画质)
- 音频控制(主音量、音乐、音效)
- 控制配置(键位映射、手柄支持)
- 游戏性选项(难度、字幕、辅助功能)
用户: "确保UI在手机和平板上都能正常显示"
系统: 自动适配:
- 不同屏幕分辨率的布局调整
- 触控友好的按钮大小
- 平板模式的优化布局
- 横竖屏切换支持
# 分析UI需求
- 识别界面类型和功能
- 确定目标平台和屏幕尺寸
- 提取设计风格和交互要求
# 设计UI架构
- 选择合适的Control节点类型
- 规划界面层次结构
- 设计数据绑定机制
# 创建视觉元素
- 设计配色方案和主题
- 创建图标和背景资源
- 配置字体和文字样式
# 实现交互逻辑
- 添加按钮和事件处理
- 实现动画和过渡效果
- 配置输入和导航系统
create_node - 创建UI节点(Button、Label、Panel等)configure_node - 配置UI节点属性add_child_node - 添加子UI节点style_node - 设置UI节点样式create_scene - 创建UI场景instance_scene - 实例化UI预制件save_scene - 保存UI场景load_scene - 加载UI场景create_resource - 创建UI资源(Theme、StyleBox等)import_asset - 导入UI素材(图标、字体等)configure_resource - 配置资源属性play_scene - 测试UI场景get_node_properties - 获取UI节点属性set_node_property - 设置UI节点属性simulate_input - 模拟用户输入测试# 智能按钮组件
class_name SmartButton extends Button
@export var hover_scale: float = 1.1
@export var click_sound: AudioStream
@export var animation_duration: float = 0.2
func _ready() -> void:
mouse_entered.connect(_on_hover)
pressed.connect(_on_pressed)
# 动态血条组件
class_name HealthBar extends ProgressBar
@export var animate_changes: bool = true
@export var animation_speed: float = 5.0
var target_health: float
func _process(delta: float) -> void:
if animate_changes and value != target_health:
value = move_toward(value, target_health, animation_speed * delta)
# 小地图系统
class_name Minimap extends Control
@export var minimap_size: Vector2 = Vector2(200, 200)
@export var world_size: Vector2 = Vector2(1000, 1000)
var player_marker: TextureRect
var enemy_markers: Array[TextureRect]
func update_player_position(world_pos: Vector2) -> void:
var minimap_pos = (world_pos / world_size) * minimap_size
player_marker.position = minimap_pos
# 技能栏系统
class_name SkillBar extends HBoxContainer
@export var skill_count: int = 4
var skill_slots: Array[SkillSlot]
func _ready() -> void:
for i in skill_count:
var slot = SkillSlot.new()
slot.skill_index = i
add_child(slot)
skill_slots.append(slot)
# 自适应布局管理器
class_name ResponsiveLayout extends Control
@export var mobile_breakpoint: int = 768
@export var tablet_breakpoint: int = 1024
func _ready() -> void:
get_tree().get_window().size_changed.connect(_on_screen_resized)
_on_screen_resized()
func _on_screen_resized() -> void:
var screen_size = DisplayServer.screen_get_size()
var layout_type = _determine_layout_type(screen_size.x)
_apply_layout(layout_type)
func _determine_layout_type(width: int) -> String:
if width < mobile_breakpoint:
return "mobile"
elif width < tablet_breakpoint:
return "tablet"
else:
return "desktop"
# 动态网格布局
class_name DynamicGrid extends GridContainer
@export var min_columns: int = 2
@export var max_columns: int = 6
@export var item_size: Vector2 = Vector2(100, 100)
func _ready() -> void:
custom_minimum_size = Vector2(min_columns * item_size.x, item_size.y)
resize_children()
func resize_children() -> void:
var available_width = size.x
var columns = clamp(int(available_width / item_size.x), min_columns, max_columns)
columns = columns
for child in get_children():
if child is Control:
child.custom_minimum_size = item_size
# UI动画管理器
class_name UIAnimationManager extends Node
var tween: Tween
func slide_in(node: Control, direction: Vector2, duration: float = 0.5) -> void:
var start_pos = node.position - direction * 100
var end_pos = node.position
node.position = start_pos
node.modulate.a = 0.0
create_tween().parallel()\
.tween_property(node, "position", end_pos, duration)\
.set_trans(Tween.TRANS_CUBIC)\
.set_ease(Tween.EASE_OUT)
create_tween().parallel()\
.tween_property(node, "modulate:a", 1.0, duration)
func bounce_effect(node: Control) -> void:
var original_scale = node.scale
create_tween().tween_property(node, "scale", original_scale * 1.2, 0.1)\
.set_trans(Tween.TRANS_BACK)\
.set_ease(Tween.EASE_OUT)
create_tween().tween_property(node, "scale", original_scale, 0.2)\
.set_trans(Tween.TRANS_BOUNCE)\
.set_ease(Tween.EASE_OUT)
# 主题管理器
class_name ThemeManager extends Node
@export var light_theme: Theme
@export var dark_theme: Theme
@export var current_theme: Theme
func _ready() -> void:
apply_theme(current_theme)
func switch_theme(theme_name: String) -> void:
match theme_name:
"light":
current_theme = light_theme
"dark":
current_theme = dark_theme
apply_theme(current_theme)
func apply_theme(theme: Theme) -> void:
# ✅ 正确:检查场景树是否存在和当前场景是否可用
if get_tree() and get_tree().current_scene:
var ui_root = get_tree().current_scene
_apply_theme_recursive(ui_root, theme)
else:
push_warning("场景树未准备就绪,无法应用主题")
func _apply_theme_recursive(node: Node, theme: Theme) -> void:
if node is Control:
node.theme = theme
for child in node.get_children():
_apply_theme_recursive(child, theme)
# 数据绑定管理器
class_name DataBindingManager extends Node
var bindings: Dictionary = {}
func bind_ui_element(ui_node: Control, data_source: Object, property: String) -> void:
var binding = {
"ui_node": ui_node,
"data_source": data_source,
"property": property
}
bindings[ui_node.get_instance_id()] = binding
# 连接数据源变化信号
if data_source.has_signal("changed"):
data_source.changed.connect(_on_data_changed.bind(ui_node))
func _on_data_changed(ui_node: Control) -> void:
var binding = bindings.get(ui_node.get_instance_id())
if binding:
var value = binding.data_source.get(binding.property)
_update_ui_value(ui_node, value)
func _update_ui_value(ui_node: Control, value) -> void:
if ui_node is Label:
ui_node.text = str(value)
elif ui_node is ProgressBar:
ui_node.value = value
elif ui_node is TextureProgressBar:
ui_node.value = value
# 游戏HUD主控制器
class_name GameHUD extends CanvasLayer
@onready var health_bar: ProgressBar = $TopPanel/HealthBar
@onready var mana_bar: ProgressBar = $TopPanel/ManaBar
@onready var level_label: Label = $TopPanel/LevelLabel
@onready var minimap: Minimap = $MinimapContainer/Minimap
@onready var skill_bar: SkillBar = $BottomPanel/SkillBar
@onready var kill_feed: VBoxContainer = $RightPanel/KillFeed
var player: Player
func _ready() -> void:
# 连接玩家信号
player.health_changed.connect(_on_health_changed)
player.mana_changed.connect(_on_mana_changed)
player.level_up.connect(_on_level_up)
func _on_health_changed(new_health: int, max_health: int) -> void:
health_bar.max_value = max_health
health_bar.value = new_health
# 血量低时显示红色警告
if new_health < max_health * 0.3:
health_bar.modulate = Color.RED
create_low_health_effect()
func _on_mana_changed(new_mana: int, max_mana: int) -> void:
mana_bar.max_value = max_mana
mana_bar.value = new_mana
func _on_level_up(new_level: int) -> void:
level_label.text = "Lv. %d" % new_level
create_level_up_effect()
# 设置界面控制器
class_name SettingsMenu extends Control
@onready var tab_container: TabContainer = $TabContainer
@onready var graphics_tab: Control = $TabContainer/Graphics
@onready var audio_tab: Control = $TabContainer/Audio
@onready var controls_tab: Control = $TabContainer/Controls
func _ready() -> void:
_load_settings()
_setup_controls()
func _load_settings() -> void:
# 加载图形设置
var resolution_option = graphics_tab.get_node("ResolutionOption")
resolution_option.selected = _get_current_resolution_index()
# 加载音频设置
var master_slider = audio_tab.get_node("MasterVolume")
master_slider.value = AudioServer.get_bus_volume_db(AudioServer.get_bus_index("Master"))
func _save_settings() -> void:
# 保存图形设置
var resolution_option = graphics_tab.get_node("ResolutionOption")
var selected_resolution = resolution_option.get_item_text(resolution_option.selected)
_apply_resolution(selected_resolution)
# 保存音频设置
var master_slider = audio_tab.get_node("MasterVolume")
AudioServer.set_bus_volume_db(AudioServer.get_bus_index("Master"), master_slider.value)
技能状态: ✅ 可用 最后更新: 2025-11-09 兼容性: Godot 4.5+ 依赖: Godot MCP 工具集 + UI设计知识