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

Godot 4多人游戏:客户端丢物品数据无法同步至服务器

问题描述

我正在开发一款基于Godot 4的生存多人游戏,包含玩家背包、箱子等外部背包系统。丢物品的逻辑设计为:物品从玩家背包移除后,将数据传输到服务器,由服务器实例化带有对应属性的物品节点。

目前服务器主机执行丢物品功能一切正常,但加入服务器的客户端执行丢物品操作时,虽然能发出信号且信号连接正常,但服务器无法接收数据,也不会为任何客户端实例化物品节点。

相关代码如下:

玩家端发送数据代码

func _on_inventory_drop_slot_data(grabbed_slot_data) -> void:
    print_debug("Sending object to server.")
    drop_item.emit(grabbed_slot_data)

服务器端接收并实例化代码

func _on_inventory_drop_slot_data(grabbed_slot_data) -> void:
    print_debug("Server is receiving object.")
    if grabbed_slot_data:
        print_debug(grabbed_slot_data)
    else:
        print_debug("no slot data")
    var pick_up = PickUp.instantiate()
    pick_up.slot_data = grabbed_slot_data
    pick_up.position = Vector3(0,10,0)
    add_child(pick_up)

另外有两个疑问:

  • 我理解服务器实例化物品后所有客户端应该都能看到,若不是这样,是否需要像实例化玩家一样用MultiplayerSpawner节点来同步所有客户端的丢物品实例化操作?
  • 客户端向服务器发送信号已确认连接正常,但服务器未接收数据并执行对应函数,该怎么解决?
解决方案

一、信号无法被服务器接收的问题

Godot多人模式里,客户端直接emit的信号默认只在本地传播,传不到服务器。别用信号做跨端通信,换成Rpc调用更靠谱:

  1. 修改玩家端代码,用Rpc替代信号发送:
func _on_inventory_drop_slot_data(grabbed_slot_data) -> void:
    print_debug("Sending object to server.")
    # 调用服务器端的处理方法,自动路由到服务器执行
    rpc("server_handle_drop_item", grabbed_slot_data)
  1. 服务器端需要把处理方法标记为Rpc方法,指定仅服务器有权执行:
@rpc("authority")
func server_handle_drop_item(grabbed_slot_data) -> void:
    print_debug("Server is receiving object.")
    if grabbed_slot_data:
        print_debug(grabbed_slot_data)
    else:
        print_debug("no slot data")
    var pick_up = PickUp.instantiate()
    pick_up.slot_data = grabbed_slot_data
    pick_up.position = Vector3(0,10,0)
    add_child(pick_up)

还要注意:玩家节点必须是服务器生成的,且multiplayer.authority要设置为服务器,不然客户端的Rpc调用服务器根本收不到。

二、物品实例化的同步问题

服务器直接实例化节点后,客户端不会自动同步显示,必须用MultiplayerSpawner来处理:

在服务器场景里添加MultiplayerSpawner节点,把PickUp场景添加到它的Spawnable Scenes列表中。之后服务器实例化PickUp时,MultiplayerSpawner会自动在所有客户端同步生成这个节点,不用自己写复杂的同步逻辑。

如果非要手动同步(不推荐,容易出bug),就得在服务器实例化物品后,把物品的位置、slot_data等信息通过Rpc广播给所有客户端,让客户端自己实例化,但这种方式麻烦且容易出错,不如直接用MultiplayerSpawner省心。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 18:40:55