如何让Godot编辑器显示脚本(如_ready函数)生成的动态内容?
让Godot脚本动态内容在编辑器中显示
要让你的调色板组件在编辑器里渲染出动态生成的按钮,核心是用Godot的@tool脚本功能,让脚本代码在编辑器环境中执行。具体修改步骤如下:
1. 添加@tool注解
在脚本最开头加上@tool,这会让脚本在编辑器和运行时都执行:
@tool extends Node2D
2. 优化节点生成逻辑(避免重复创建)
原代码的_ready只执行一次,编辑器中修改colors数组后不会更新按钮。我们需要监听属性变化,每次colors修改时清空旧按钮并重新生成:
修改后的完整代码:
@tool extends Node2D @export var colors:Array[Color] = []: set(value): colors = value update_palette() signal color_selected(color:Color) func _ready(): update_palette() func update_palette(): # 清空现有按钮 for child in get_children(): if child is TextureButton: child.queue_free() var x = 0 var size = 100 # 编辑器中建议用preload确保资源加载稳定 var white_texture = preload("res://white_pixel.png") for clr in colors: var btn = TextureButton.new() btn.size = Vector2(size, size) btn.texture_normal = white_texture btn.stretch_mode = TextureButton.STRETCH_SCALE btn.modulate = clr btn.position = Vector2(x, 0) # 编辑器中避免触发运行时的信号逻辑 if not Engine.is_editor_hint(): btn.connect("button_down", color_clicked.bind(btn)) add_child(btn) x += size func color_clicked(btn:TextureButton): emit_signal("color_selected", btn.modulate)
关键说明
@tool:让脚本在编辑器中运行,所有节点创建、属性修改逻辑都会实时反映到编辑器视图中。@export var colors的set回调:当你在检查器中修改颜色数组时,会自动触发update_palette(),清空旧按钮并重新生成新的颜色按钮。Engine.is_editor_hint():判断当前是否在编辑器环境,避免编辑器中触发按钮点击的信号逻辑(编辑器中点击按钮无需发送color_selected信号)。preload替代load:编辑器中preload比load更稳定,确保资源能正确加载。
注意事项
- 确保
white_pixel.png路径正确,否则编辑器中会显示缺失纹理的按钮。 @tool脚本的错误会直接影响编辑器运行,调试时要注意避免逻辑错误导致编辑器崩溃。
内容的提问来源于stack exchange,提问作者Sergey Belonozhko
相关产品推荐
相关产品推荐

