如何在Godot编辑器中创建可复用的多节点组合自定义节点?
解决Godot可复用带子节点组件的问题
你之前的问题核心是混淆了脚本注册(class_name)和场景预制件的作用——class_name只是让脚本类型可被搜索/代码引用,但不会保存节点结构、子节点和预设属性。正确的做法是用**场景(Scene)**作为可复用预制件,结合class_name实现可视化复用和代码实例化,步骤如下:
1. 创建带完整结构的预制场景
- 新建场景,根节点选择
Button,将场景保存为DeleteMeButton.tscn(路径可自行指定,比如res://components/DeleteMeButton.tscn) - 手动完成所有预设设置:调整Button的大小、形状、默认文本;添加
Sprite2D子节点,拖到右上角并设置好纹理;给根Button附加脚本 - 在脚本顶部添加
class_name DeleteMe,后续不管在编辑器还是代码里都能快速定位这个组件
2. 复用组件的两种方式
编辑器可视化复用
- 打开场景面板,找到保存的
DeleteMeButton.tscn直接拖入当前场景;或者在节点创建对话框搜索DeleteMe(因注册了class_name),创建的节点会自动携带所有预设的子节点、大小、文本和Sprite2D位置
代码实例化
如果需要动态创建组件,直接加载场景并实例化:
var delete_button = load("res://components/DeleteMeButton.tscn").instantiate() add_child(delete_button)
3. 解决编辑器中看不到动态设置内容的问题
如果需要在脚本里动态控制属性(比如文本、Sprite纹理),不要用_init(),改用@export变量+_ready():
extends Button class_name DeleteMe # 导出变量,编辑器内可直接修改,场景保存后会保留设置 @export var default_text: String = "删除" @export var icon_texture: Texture2D func _ready(): text = default_text $Sprite2D.texture = icon_texture
这样在编辑器里选中该组件节点,就能在检查器面板修改这些导出变量,保存场景后所有实例都会继承设置,且编辑器预览时能直接看到效果——_init()在编辑器预览阶段不会执行,而_ready()会在节点加载完成后运行,所以能正确显示动态设置的内容
为什么之前的方法无效?
- 仅用
class_name DeleteMe注册脚本,新建的只是纯Button节点,不会包含你手动添加的Sprite2D子节点和预设属性,因为脚本本身不存储节点结构 _init()是节点构造方法,编辑器在预览节点时不会触发这个方法,所以你在_init()里设置的文本无法在编辑器中显示
内容的提问来源于stack exchange,提问作者Cory Klein
相关产品推荐
相关产品推荐

