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

如何解决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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 19:17:22