🌐
核心结论:Relay 让玩家无需公开 IP、配置端口转发或维护专用服务器即可连接。新项目通过 Sessions API 启用 Relay,不要再手动拼接旧版 Allocation、JoinAllocation 和 Lobby 心跳流程。

Relay 解决什么问题

Host 模式中,一名玩家既是服务器又是客户端。其他玩家若直接连接 Host,常见障碍包括:
  • 家用路由器 NAT
  • 运营商 CGNAT
  • 防火墙和动态公网地址
  • 暴露主机 IP 带来的隐私风险
Relay 让 Host 和 Client 都主动连接 Unity 中继节点,再由节点转发 NGO/Unity Transport 数据包。

1. 前置配置

  1. 在 Unity Dashboard 关联项目并启用 Multiplayer Services。
  1. 安装 com.unity.services.multiplayer
  1. 安装 com.unity.netcode.gameobjects
  1. 场景中的 NetworkManager 选择 UnityTransport
  1. 初始化 UGS 并认证玩家。
  1. 配置 Player Prefab 与网络场景。

2. Host 创建 Relay Session

WithRelayNetwork() 告诉 Sessions 使用 Relay 连接类型。SDK 会协调:
  1. 创建 Lobby / Session。
  1. 订阅后端事件并维护 Host 心跳。
  1. 创建 Relay Allocation。
  1. 把连接数据注册到 Lobby。
  1. 配置 Unity Transport。
  1. 启动 NGO Host。
因此这里不再调用 RelayService.Instance.CreateAllocationAsync,也不手动调用 NetworkManager.StartHost()

3. Client 通过代码加入

Sessions 会加入对应 Lobby,获取 Relay 连接数据,配置 Transport 并启动 NGO Client。成功返回后,NGO 的连接已经由网络处理器建立。

4. 正确离开

不要同时调用 LeaveAsyncNetworkManager.Shutdown 和旧 Lobby 删除接口争抢清理顺序。使用默认 Sessions 网络处理器时,让 LeaveAsync 统一关闭成员关系和关联网络模块。

5. Relay 提供和不提供的安全性

Relay 的价值:
  • 不向其他玩家公开 Host IP
  • 降低 NAT 和端口转发问题
  • 为客户端托管游戏提供统一连接入口
Relay 不提供
  • 服务器权威反作弊
  • 输入合法性验证
  • 世界状态持久化
  • Host 本机进程的防篡改
  • Dedicated Server 的稳定性
Host 仍然掌握服务器权威代码。竞技游戏应考虑 Dedicated Server,至少也要让 Host 验证客户端输入而不是相信客户端结果。

6. Host 掉线会怎样

Relay Host 断开后,其他玩家会失去当前 Relay 网络连接。Session 后端可以选出新 Host,但 NGO 内存中的世界状态、NetworkObject 和场景进度不会因此自动复制给新 Host。
真正的 Host Migration 至少包含:
  1. 后端重新选主。
  1. 创建新的 Relay 连接。
  1. 保存并传输权威状态快照。
  1. 客户端重连。
  1. 新 Host 恢复对象、所有权和场景。
没有实现这套流程时,应在 UI 明确提示“主机离开,对局结束”。

7. 延迟与带宽

Relay 比局域网直连多一个网络跳数。优化重点仍在 NGO 层:
  • 降低不必要的同步频率
  • 避免每帧可靠 RPC
  • 对位置、旋转做量化和插值
  • 控制 NetworkObject 数量与观察者范围
  • 使用 Multiplayer Tools / Network Profiler 查看消息体积
  • 在真实目标地区和移动网络测试 RTT、抖动和丢包
Relay 有服务限制和计费边界,上线前应核对当前 Fair Usage、Rate Limits 和区域支持。

8. 旧教程迁移提示

旧版教程通常展示:
  • RelayService.Instance.CreateAllocationAsync
  • GetJoinCodeAsync
  • JoinAllocationAsync
  • UnityTransport.SetRelayServerData
  • 手动 StartHost/StartClient
这些调用适用于维护旧独立 SDK 的项目。新项目使用 Multiplayer Services Sessions 后,不要把旧代码和 WithRelayNetwork() 混在同一流程中。

9. 测试清单

  • 两个 Editor 实例能用加入码连接
  • 错误加入码能返回友好提示
  • Client 主动离开后 Host 成员列表更新
  • Host 退出时 Client 能回到主菜单
  • 重复点击 Host/Join 不会创建两次请求
  • 场景切换由 NGO NetworkSceneManager 发起
  • 高延迟和丢包下不会重复生成玩家
  • 移动端切后台后能检测断线并恢复 UI

系列导航

  1. 🗒️
    Unity 联机架构入门:NGO、Lobby、Relay 各自负责什么
  1. 🗒️
    NGO 入门:NetworkObject、NetworkVariable 与 RPC
  1. 🗒️
    Lobby 教程:用 Multiplayer Sessions 创建、查询和加入房间
  1. 🗒️
    Relay 教程:用 Sessions API 让 NGO 安全连接
  1. 🗒️
    完整实战:从大厅到游戏的 NGO + Lobby + Relay 流程

参考资料