Godot 4中connect()函数参数报错问题求助
Godot 4 背包系统信号连接报错修复
参考Godot 3背包教程编写Godot 4代码时,inv_slot.connect("gui_input" , self , "slot_gui_input", [inv_slot])这行出现以下报错:
- 第9行:connect()调用参数过多,最多期望3个却收到4个
- 第9行:connect()函数参数2应为Callable类型,实际为res://Inventory/Item/Item.gd
- 第9行:无法将String类型的值作为int传递
- 第9行:connect()函数参数3应为int类型,实际为String
原代码
extends Node2D const SlotClass = preload("res://Inventory/Slot.gd") @onready var inventory_slots = $GridContainer var holding_item = null func _ready(): for inv_slot in inventory_slots.get_children(): inv_slot.connect("gui_input" , self , "slot_gui_input", [inv_slot]) func slot_gui_input(event: InputEvent, slot: SlotClass): if event is InputEventMouseButton: if event.button_index == MOUSE_BUTTON_LEFT & event.pressed: if holding_item != null: if !slot.item: # Place holding item to slot slot.putIntoSlot(holding_item) holding_item = null else: # Swap holding item with item in slot var temp_item = slot.item slot.PickFromSlot() temp_item.global_position = event.global_position slot.putIntoSlot(holding_item) holding_item = temp_item elif slot.item: holding_item = slot.item slot.pickFromSlot() holding_item.global_position = get_global_mouse_position() func _input(event): if holding_item: holding_item.global_position = get_global_mouse_position()
问题根源与修复方案
Godot 4彻底修改了信号连接API,不再支持Godot 3中connect(signal, target, method, binds)的写法,改用Callable作为核心传递方式,参数绑定逻辑也同步调整。
1. 修复信号连接代码
将_ready()中的连接代码替换为以下两种写法之一:
- Callable绑定参数写法:
inv_slot.gui_input.connect(Callable(self, "slot_gui_input").bind(inv_slot))
- 匿名函数直观写法:
inv_slot.gui_input.connect(func(event): slot_gui_input(event, inv_slot))
2. 修复其他代码问题
原代码还有两处逻辑/格式错误:
- 逻辑判断
event.button_index == MOUSE_BUTTON_LEFT & event.pressed中的&是位运算符,应改为逻辑与运算符&& slot.PickFromSlot()大小写不统一,与后续slot.pickFromSlot()保持一致,改为小写slot.pickFromSlot()
修改后的完整代码
extends Node2D const SlotClass = preload("res://Inventory/Slot.gd") @onready var inventory_slots = $GridContainer var holding_item = null func _ready(): for inv_slot in inventory_slots.get_children(): inv_slot.gui_input.connect(Callable(self, "slot_gui_input").bind(inv_slot)) func slot_gui_input(event: InputEvent, slot: SlotClass): if event is InputEventMouseButton: if event.button_index == MOUSE_BUTTON_LEFT && event.pressed: if holding_item != null: if !slot.item: # Place holding item to slot slot.putIntoSlot(holding_item) holding_item = null else: # Swap holding item with item in slot var temp_item = slot.item slot.pickFromSlot() temp_item.global_position = event.global_position slot.putIntoSlot(holding_item) holding_item = temp_item elif slot.item: holding_item = slot.item slot.pickFromSlot() holding_item.global_position = get_global_mouse_position() func _input(event): if holding_item: holding_item.global_position = get_global_mouse_position()
内容的提问来源于stack exchange,提问作者Tieuacma
相关产品推荐
相关产品推荐

