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

