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

