Godot 4 多人联机开发
将以下提示词粘贴到你的 AI 对话框中:
请根据 https://skillhub.cn/install/skillhub.md,安装 @user_3c6cb52e/godot-multiplayer-sh-rwpnda。
技能介绍
要解决什么问题
在 Godot 4.x 里做联机,常见需求是:主机/加入对局、远程调用逻辑、决定「谁有权改这个节点」、以及把场景实例和属性自动同步到各端。底层自己拼 TCP/UDP 或 WebSocket 成本高,本地分屏也不走这套 API。本技能聚焦 Godot 4.3+ 的 ENet 高层联机:MultiplayerPeer、@rpc、MultiplayerSpawner / MultiplayerSynchronizer,并默认 客户端输入不可信、服务端权威。
核心工作流
- 创建 ENetMultiplayerPeer,
create_server(port, max)或create_client(ip, port),赋给multiplayer.multiplayer_peer。服务端 ID 固定为 1,客户端为随机正 ID。 - 在
multiplayer上处理peer_connected、peer_disconnected、connected_to_server、connection_failed、server_disconnected。 - 用 @rpc(...) 声明远程方法;通过
rpc()或rpc_id(peer_id)调用;内部用multiplayer.get_remote_sender_id()识别发送方。 - 各端脚本里 @rpc 方法集合与注解必须完全一致(Godot 会校验 checksum,不一致可能静默失败或报错位置误导)。
set_multiplayer_authority(id)设节点权威,用is_multiplayer_authority()门控输入与 RPC。- MultiplayerSpawner 在各端实例相同场景;MultiplayerSynchronizer 同步选定属性。
- 在服务端校验:位置、命中、血量等不要直接信任客户端上报的结果,只收「意图」再广播。
技能还覆盖典型模式:Host/Join、客户端把输入 RPC 到服务端(any_peer + call_local)、每玩家控制各自角色、Synchronizer 编辑器配置等。
适用边界与坑
- 不适用:纯本地分屏;原生 PacketPeer 级协议;HTTP 请求;存档持久化请用 save-systems 类技能。
- 默认 @rpc 为 authority,客户端调用会被忽略,需
any_peer;主机也要跑时用call_local。 - NodePath 各端须一致;spawn 时用 MultiplayerSpawner 或
add_child(node, true)保证命名一致。 - @rpc 只能写在 Node 子类;参数勿传 Object/Callable,只用标量与容器类型。
- 断开时把
multiplayer.multiplayer_peer设为OfflineMultiplayerPeer.new();Android 导出需 INTERNET 权限。
更细的 Spawner/Synchronizer、通道、SceneMultiplayer 鉴权与专用服导出说明见技能内 references/replication-and-rpc.md。
使用场景
- Godot 4 项目要从单机改成可主机/加入的联机对局,需要按 ENet 建连并处理断线重连信号
- 为玩家角色做「各端只驱动自己的 Avatar」,要用节点权威和客户端到服务端的输入 RPC
- 新刷出的敌人或子弹要在所有客户端出现且属性一致,需配置 MultiplayerSpawner 与 Synchronizer
- 联机里血量与命中结果不能信客户端上报,要在服务端校验意图后再用 RPC 广播结果
适合人员
- 用 Godot 4 做独立联机游戏的程序员,需要 ENet、@rpc 与状态复制的标准流程
- 从 Godot 3 或自研 Socket 迁到 4.x SceneMultiplayer 的客户端工程师
- 要导出无头专用服、并在编辑器里配 MultiplayerSynchronizer 通道与复制属性的后端/全栈开发者
- 在联机原型阶段反复踩 RPC checksum 与 NodePath 不一致问题的 gameplay 程序员