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
相关产品推荐
相关产品推荐

