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

使用@tool时Godot编辑器中实例化节点不显示在节点树的问题

Godot编辑器模式下动态生成节点不显示在场景树的解决办法

问题回顾

使用@tool脚本实现的TerrainManager,可从PackedScene数组中随机选择TerrainPart实例并添加到Parts容器。运行游戏时功能正常,但编辑器模式下,虽输出确认节点已加入树中(is_inside_tree()返回true),场景树却无法看到这些实例,也无法选中调试。

核心原因

Godot编辑器仅会展示属于当前场景的持久化节点:动态生成的节点默认未关联场景的owner属性,编辑器将其判定为临时节点,即便已加入节点树并能正常渲染,也不会在场景树中显示。

具体修复步骤

1. 为动态节点设置owner属性

在add_segment函数中,实例化节点后添加代码,将节点的owner设为容器节点的owner(即当前场景的根节点),让编辑器识别该节点属于当前场景:

func add_segment() -> void:
    var random_part = terrain_parts.pick_random().duplicate() as PackedScene
    var part = random_part.instantiate()
    part.name = "TerrainPartInstance_%s" % part.name

    # 关键:让编辑器识别节点属于当前场景
    if Engine.is_editor_hint():
        part.owner = terrain_part_container.owner

    terrain_part_container.add_child(part)

    # 后续位置调整代码保持不变
    if terrain_part_container.get_child_count() > 1:
        var _part = terrain_part_container.get_child(terrain_part_container.get_child_count() - 2) as TerrainPart
        end_position += _part.global_position_end - _part.global_position_start
    
    part.position = end_position + part.global_position_start

2. 手动触发编辑器场景树刷新(可选)

若设置owner后仍未显示,可在添加节点后通知编辑器刷新场景树:

# 放在add_segment函数末尾
if Engine.is_editor_hint():
    get_tree().edited_scene_root.notify_property_list_changed()

3. 修复节点命名异常问题

从调试输出可见部分节点名为@Node2D@xxxx,说明这些实例未正确继承TerrainPart类。需检查terrain_parts数组中的PackedScene,确保所有场景的根节点均为TerrainPart类型,避免as TerrainPart转换失败导致逻辑异常。

额外说明

  • owner属性是区分临时节点与场景持久化节点的核心,设置正确后编辑器会自动在场景树中展示节点。
  • @tool脚本操作编辑器节点时,因界面更新为异步机制,必要时需手动触发刷新确保同步。

内容的提问来源于stack exchange,提问作者Ben

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 06:42:50