版本说明(2026-07):新项目应优先使用 Multiplayer Services SDK 的 Sessions API。它统一协调 Lobby、Relay 与 Netcode,避免手动维护三套独立 SDK。本文以 Unity 6 和 NGO 2.13.x 为基线。
先看结论推荐架构NGO:实时游戏层Lobby:组队与发现层Relay:安全连接层Sessions:新项目的统一入口一次完整连接发生了什么架构选择适合 Host + Relay更适合 Dedicated Server常见误区系列导航参考资料
先看结论
这三个系统解决的是不同层次的问题:
系统 | 负责什么 | 不负责什么 |
NGO | 同步 GameObject、状态、RPC、所有权和网络场景 | 房间发现、NAT 穿透、云端大厅 |
Lobby | 玩家分组、房间列表、加入码、元数据和成员关系 | 实时传输角色位置与战斗数据 |
Relay | 通过中继服务器转发客户端与主机之间的流量 | 游戏状态权威、反作弊和存档 |
Sessions | 统一编排 Lobby、Relay、NGO 的创建、加入和离开 | 替你设计具体玩法同步规则 |
推荐架构
在新版 SDK 中,调用
CreateSessionAsync(...WithRelayNetwork()) 时,上述 Lobby 创建、心跳、Relay 分配、Transport 配置和 NGO 启动由 Sessions 协调。加入方调用 JoinSessionByCodeAsync 后,SDK 同样会处理 Lobby 加入和 NGO 网络连接。NGO:实时游戏层
NGO 是高层网络库,核心对象包括:
NetworkManager:启动和关闭网络会话
NetworkObject:让 GameObject 获得网络身份
NetworkBehaviour:编写网络行为
NetworkVariable<T>:同步持续状态
[Rpc]:发送离散事件
NetworkTransform:同步 Transform
默认客户端-服务器模型通常是服务器权威:客户端发送意图,服务器验证并修改状态。Relay 不会改变这一点,Host 仍然同时承担服务器和本地客户端职责。
Lobby:组队与发现层
Lobby 保存的是低频会话数据,例如房间名、地图、模式、是否锁定、玩家准备状态。它适合:
- 通过加入码邀请玩家
- 浏览公开房间
- 在开局前交换角色、队伍和准备状态
- 记录当前成员
不要用 Lobby 属性持续同步位置或生命值。它不是实时游戏传输通道,还受到请求频率限制。
Relay:安全连接层
客户端直连主机经常被 NAT、防火墙和动态公网地址阻断。Relay 让双方主动连接 Unity 的中继节点,由节点转发数据,并避免向其他玩家暴露主机 IP。
Relay 解决的是可连接性和地址隐藏,不是:
- 权威服务器
- 防作弊
- 主机迁移后的世界状态恢复
- 大规模专用服务器托管
Sessions:新项目的统一入口
Multiplayer Services SDK 将原先独立的 Lobby、Matchmaker、Relay SDK 合并为以 Session 为中心的 API。Session 代表一组在一段游戏期间保持关联的玩家,可以通过加入码、房间列表或匹配加入。
推荐依赖:
com.unity.services.multiplayer
com.unity.netcode.gameobjects
com.unity.multiplayer.playmode(本地多实例测试)
Unity 6 的 Multiplayer Center 可以根据项目需求安装和配置相关包。
一次完整连接发生了什么
- 初始化 UGS,并完成玩家认证。
- 主机创建带 Relay 网络的 Session。
- Sessions 创建 Lobby、启动心跳并申请 Relay。
- Sessions 配置 Unity Transport,启动 NGO Host。
- 客户端用加入码加入 Session。
- Sessions 取得 Relay 数据并启动 NGO Client。
- NGO 生成 PlayerObject,同步场景和游戏状态。
- 玩家离开时调用
session.LeaveAsync(),让 SDK 清理后端成员与网络模块。
架构选择
适合 Host + Relay
- 2 到十几人的合作或派对游戏
- 可以接受主机掉线影响当前对局
- 希望快速上线,不维护专用服务器
更适合 Dedicated Server
- 强对抗、重反作弊
- 长时间持续世界
- 主机不能拥有额外权力
- 需要稳定的服务器帧率和公网可用性
常见误区
- Lobby 不是服务器:它保存成员和元数据,不运行战斗逻辑。
- Relay 不是专用服务器:它只转发加密连接中的数据包。
- RPC 不是状态仓库:持续状态用
NetworkVariable或自定义同步。
- Host 迁移不等于世界迁移:新主机选举、Relay 重连和 NGO 状态恢复是三个不同问题。
- 匿名登录不等于正式账号:原型阶段方便,正式项目应绑定平台账号并处理恢复。