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

Godot 4.1 WebSocket调用RPC失败:未知Peer ID问题求助

Godot WebSocket多人游戏:RPC生成玩家Avatar仅在服务器端生效的解决方法

核心问题分析

问题根源在于客户端未实现对应服务器RPC调用的处理函数,同时存在自定义数据包与Godot内置RPC系统的逻辑混淆。聊天功能用自定义数据包能正常工作,但生成Avatar的RPC调用要求客户端与服务器的节点、函数完全匹配才能触发执行。

具体修复步骤

1. 给客户端添加对应RPC函数

服务器调用addNewPlayer和addExistingPlayers时,客户端场景内的Server节点必须有同名的@rpc函数,否则无法识别并执行远程调用。

修改客户端的Server.gd(拆分项目则给客户端项目的Server节点添加该脚本):

@rpc("any_peer", "call_local")
func addNewPlayer(id):
    var currentPlayer = PlayerScene.instantiate()
    currentPlayer.name = str(id)
    get_tree().root.add_child(currentPlayer)
    currentPlayer.global_position = $PlayerSpawn.global_position

@rpc("any_peer", "call_local")
func addExistingPlayers(idExcluded):
    # 客户端无需遍历服务器的users列表,仅需保留函数让RPC能触发即可
    pass

2. 修正RPC调用的目标对象

服务器端调用RPC时,要明确目标客户端ID,避免无效调用:

# 仅给新连接的玩家发送生成其自身Avatar的RPC
addNewPlayer.rpc_id(int(data.id), data.id)
# 给所有已连接客户端发送生成新玩家Avatar的RPC
addNewPlayer.rpc(data.id)
# 给新玩家发送加载已有玩家的RPC(原代码逻辑正确,保留)
addExistingPlayers.rpc_id(int(data.id), data.id)

3. 检查MultiPeer初始化顺序

客户端必须在成功连接服务器并获取ID后,再设置multiplayer.multiplayer_peer = peer_socket;同时服务器端要正确初始化主机模式的WebSocketMultiplayerPeer:

# 服务器端初始化示例
var peer = WebSocketMultiplayerPeer.new()
peer.server_listen(8080) # 替换为你的端口
multiplayer.multiplayer_peer = peer

4. 优先使用内置RPC替代自定义数据包(可选)

可以抛弃自定义JSON数据包,直接用Godot内置RPC处理玩家加入请求,减少解析错误:
客户端代码修改:

# 连接成功获取ID后,直接调用服务器的RPC(服务器默认ID为1)
$Server.addNewPlayer.rpc_id(1, id)

额外注意事项

  • 无论单项目还是拆分项目,客户端与服务器的节点结构必须完全一致,尤其是包含RPC函数的节点路径(如Control/Server)。
  • 导出HTML5时,需确保服务器WebSocket端口允许跨域请求,否则会出现连接失败。
  • 可通过Godot的Debug -> Network Profiler面板,查看RPC是否成功发送到客户端,辅助定位问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 12:01:24