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

Godot中connect运行时错误与Callable编译错误求助

Godot按钮绑定与场景生成问题修复

问题背景

我是Godot新手,为积累经验参加Game Jam,需要实现点击按钮将指定场景生成到12个预设位置中的随机空位,但按钮绑定代码用connect或Callable都报错。

错误信息

使用connect时的错误

Line 23:Invalid argument for "connect()" function: argument 2 should be "Callable" but is "res://scenes/spawn_button_1.gd".

Line 23:Cannot pass a value of type "String" as "int".

Line 23:Invalid argument for "connect()" function: argument 3 should be "int" but is "String".

使用Callable时的错误

Invalid call. Nonexistent function 'Callable' in base 'Button(spawn_button_1.gd)'.

原始代码

extends Button

#var rares = {"common" : 15,
    #"rare" : 5,
    #"worthless" : 2}
            
@export var scene_to_spawn : PackedScene

@onready var spawn_button = $".")

var spawn_positions = [
    Vector2(-65, -65), Vector2(120, -65), Vector2(65, -28),
    Vector2(-25, -65), Vector2(160, -65), Vector2(15, -28),
    Vector2(15, -65), Vector2(160, -28), Vector2(-25, -28),
    Vector2(65, -65), Vector2(120, -28), Vector2(-65, -28)
]

var occupied_positions = []

func _ready() -> void:
     spawn_button.Callable("pressed", "_on_Button_pressed")

func _on_pressed() -> void:
    your text`var available_positions = get_available_positions()
    
    if available_positions.size() > 0:
        var random_position = available_positions[randi() % available_positions.size()]
    
        var new_scene = scene_to_spawn.instantiate()
    
    new_scene.position = random_position

    add_child(new_scene)
        
    occupied_positions.append(random_position)
else:
    print("no spots!")
        
func get_available_positions() -> Array:
    var available_positions = []
    
    for position in spawn_positions:
        if !occupied_positions.has(position):
            available_positions.append(position)
        return available_positions

问题修复

1. 按钮绑定错误修正

Godot中信号绑定的正确方式:

  • 脚本本身继承自Button,无需额外获取spawn_button变量,直接用pressed.connect(_on_pressed)即可,参数传入函数本身而非字符串。

修正后的_ready函数:

func _ready() -> void:
    pressed.connect(_on_pressed)

2. 语法与逻辑错误修正

  • 删除_on_pressed函数内的无效内容your text
  • 调整缩进:场景实例化后的位置设置、添加子节点、记录位置的代码必须放在if代码块内,否则无空位时会报错
  • 修正get_available_positions的return位置:必须放在for循环外,否则只会检查第一个位置就返回结果

修复后完整代码

extends Button

#var rares = {"common" : 15,
    #"rare" : 5,
    #"worthless" : 2}
            
@export var scene_to_spawn : PackedScene

var spawn_positions = [
    Vector2(-65, -65), Vector2(120, -65), Vector2(65, -28),
    Vector2(-25, -65), Vector2(160, -65), Vector2(15, -28),
    Vector2(15, -65), Vector2(160, -28), Vector2(-25, -28),
    Vector2(65, -65), Vector2(120, -28), Vector2(-65, -28)
]

var occupied_positions = []

func _ready() -> void:
    pressed.connect(_on_pressed)

func _on_pressed() -> void:
    var available_positions = get_available_positions()
    
    if available_positions.size() > 0:
        var random_position = available_positions[randi() % available_positions.size()]
        var new_scene = scene_to_spawn.instantiate()
        new_scene.position = random_position
        add_child(new_scene)
        occupied_positions.append(random_position)
    else:
        print("no spots!")
        
func get_available_positions() -> Array:
    var available_positions = []
    
    for position in spawn_positions:
        if !occupied_positions.has(position):
            available_positions.append(position)
    return available_positions

额外提示

  • 可通过Godot编辑器可视化绑定信号:选中Button节点,右侧"信号"面板找到pressed信号,点击连接并选择当前脚本的_on_pressed函数,无需手动写connect代码
  • 如需初始化随机数,可在_ready中添加randomize()确保每次运行随机结果不同

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 06:33:22