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

Godot 4.0.rc-2编辑器插件修改场景树节点数组属性遇阻求助

问题分析与解决方案

问题核心

在Godot编辑器插件中修改节点的导出数组属性时,遇到两个关键限制:

  • 未添加@export的用户变量无法在编辑器插件中直接访问,触发Invalid get index错误
  • 添加@export后,导出的数组在编辑器环境下处于只读状态,直接修改元素会触发Array is in read-only state错误

这是因为Godot编辑器为保证场景数据稳定性,对节点自定义变量的访问做了限制,导出的数组会被包装成只读对象防止直接修改。

直接解决方案:复制数组后替换

要修改导出数组,需先获取数组副本,修改副本后通过set()方法替换原属性值,同时用get()方法安全获取属性,避免直接访问变量。

修改后的插件代码

# plugin.gd
...
func on_node_registered(sysnode):
    # 获取数组副本并修改,再设置回节点
    var new_ids = sysnode.get("net_ids").duplicate()
    new_ids.resize(12)
    sysnode.set("net_ids", new_ids)

func on_node_edit_connection_request(a, a_from, b, b_to):
    var node_from = get_sysnode(a)
    var node_to = get_sysnode(b)
    const new_ind = create_new_id()

    # 处理源节点的索引
    var from_ids = node_from.get("net_ids").duplicate()
    from_ids[a_from] = new_ind
    node_from.set("net_ids", from_ids)

    # 处理目标节点的索引
    var to_ids = node_to.get("net_ids").duplicate()
    to_ids[b_to] = new_ind
    node_to.set("net_ids", to_ids)

节点代码保持不变

# system_node.gd
@export var net_ids: Array[int] = []

高效替代方案:用自定义资源存储数组

如果节点数量较多,频繁复制数组会有性能损耗,可以把net_ids封装成自定义资源。资源的属性在编辑器中可直接修改,无需复制整个数组。

1. 创建自定义资源类

# NetIdsResource.gd
extends Resource
@export var ids: Array[int] = []

2. 修改节点代码

# system_node.gd
@export var net_ids: NetIdsResource = NetIdsResource.new()

3. 修改插件代码

# plugin.gd
...
func on_node_edit_connection_request(a, a_from, b, b_to):
    var node_from = get_sysnode(a)
    var node_to = get_sysnode(b)
    const new_ind = create_new_id()

    # 直接修改资源中的数组元素
    node_from.net_ids.ids[a_from] = new_ind
    node_to.net_ids.ids[b_to] = new_ind

    # 通知编辑器刷新属性面板
    node_from.notify_property_list_changed()
    node_to.notify_property_list_changed()

这种方式更高效,修改会直接同步到场景文件中,适合大规模节点的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 18:24:28