You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 08:05:02