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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 13:15:18