如何解决Godot场景间传数据时的‘Invalid get index 'collision'’错误?
Godot模态弹窗场景数据传递问题修复
错误原因分析
你遇到的Invalid get index 'collision' (on base: 'String')错误,是因为在_on_area_2d_body_entered里直接把场景路径字符串("res://Area2d.tscn"、"res://Modal.tscn")传给了transerData函数。字符串类型根本没有collision属性,自然会触发索引错误。
另外,悬停变量显示正确但弹窗不显示,核心问题是你误操作了场景资源文件的变量,而非运行时实际存在的节点实例的变量。场景文件只是模板,只有实例化后的节点才会在游戏中渲染和执行逻辑。
修复方案与代码调整
1. 确保模态弹窗已实例化到场景树
要么在编辑器中直接把Modal.tscn的实例拖入主场景,要么在代码中动态实例化(二选一即可)。
2. 修改碰撞检测器代码
直接获取模态弹窗的节点实例,给实例的collision属性赋值,不需要多余的transerData函数:
extends Node2D var collision: int = 0 # 存储模态弹窗的实例引用 var modal_instance: Node2D = null func _ready(): # 方式1:如果Modal实例已在编辑器中添加到主场景,根据实际路径获取 modal_instance = get_node("/root/Modal") # 方式2:动态实例化Modal(如果没在编辑器中添加) # var modal_scene = load("res://Modal.tscn") # modal_instance = modal_scene.instance() # get_tree().root.add_child(modal_instance) func _on_area_2d_body_entered(_body): $Sprite2D.visible = false collision = 1 # 直接修改实例的collision变量 modal_instance.collision = collision
3. 简化模态弹窗代码
移除无用的transerData函数,保留原有逻辑即可:
extends Node2D var collision: int = 0 func _ready(): $Sprite2D.visible = false position = Vector2(617, 313) func _process(_delta): if collision == 1: $Sprite2D.visible = true
额外注意事项
- 如果使用动态实例化,必须调用
add_child把实例加入场景树,否则实例的_process函数不会执行,弹窗也不会显示。 - 确保
get_node的路径正确,比如模态弹窗实例在主场景的根节点下,路径就是/root/Modal,如果在其他节点下,需要调整路径(比如/root/Main/Modal)。
内容的提问来源于stack exchange,提问作者DIMITRI PORTILLA
相关产品推荐
相关产品推荐

