Godot EditorScript重父节点后编辑器树视图节点消失问题
在Godot EditorScript中正确重父节点的解决方案
你遇到的节点在编辑器树视图消失但视图中可见的问题,核心是场景未标记为已修改,导致编辑器树视图没有刷新,同时遍历子节点时的列表处理也需要注意避免结构变化的影响。
以下是修正后的完整代码,同时按需求添加了凸碰撞体的创建逻辑:
@tool extends EditorScript func _run(): # 先获取场景根子节点的副本,避免遍历中结构变化干扰 var meshes = Array(get_scene().get_children()) for node in meshes: # 只处理直接属于场景根的节点 if node.get_parent() != get_scene(): continue # 创建新的父节点 var parent: Node3D = Node3D.new() parent.name = node.name + "_root" # 将父节点添加到场景根并设置owner(确保保存时包含) get_scene().add_child(parent) parent.owner = get_scene() # 重父化网格节点 node.reparent(parent) node.owner = parent # 按需求添加凸碰撞体 var collision = CollisionShape3D.new() var convex_shape = ConvexPolygonShape3D.new() convex_shape.create_from_mesh(node.mesh) collision.shape = convex_shape collision.owner = parent parent.add_child(collision) # 标记场景为已修改,触发编辑器树视图刷新 get_scene().set_scene_changed(true) # 手动刷新编辑器树视图(部分Godot版本可能需要) get_editor_interface().get_editor_main_screen().refresh_tree()
关键修改说明:
- 子节点列表副本:用
Array(get_scene().get_children())创建初始子节点的副本,避免遍历过程中场景结构变化导致的遍历异常。 - 标记场景修改:调用
get_scene().set_scene_changed(true)告诉编辑器场景已更改,触发树视图和相关界面的刷新,这是解决节点在树视图消失的核心步骤。 - 手动刷新树视图:部分Godot版本中,仅标记场景修改可能不够,调用
get_editor_interface().get_editor_main_screen().refresh_tree()强制刷新编辑器树视图。 - 凸碰撞体创建:根据你的需求,自动为每个网格生成凸碰撞体,完成场景到Mesh Library的转换准备。
内容的提问来源于stack exchange,提问作者MrSomeone
相关产品推荐
相关产品推荐

