👥
版本说明:本文使用 Unity.Services.Multiplayer 的 Sessions API。新项目不再需要自行组合 Lobby 心跳、Relay 分配和 NGO 启动;Sessions 会统一协调这些生命周期。

Lobby 到底是什么

Lobby 保存一组玩家在开局前后的成员关系和低频元数据。常见用途包括:
  • 创建公开或私有房间
  • 通过短加入码邀请好友
  • 浏览可加入房间
  • 保存地图、模式、队伍与准备状态
  • 记录玩家加入和离开
角色位置、子弹、动画和战斗状态应由 NGO 传输,不要写进 Lobby 属性。

1. 初始化 UGS 与认证

所有 Multiplayer Services 调用前必须初始化 UGS,并认证当前玩家:
匿名认证适合原型。正式产品应绑定平台账号或其他外部身份,避免清理本地数据后丢失匿名账号。使用 Authentication 的项目还要检查 Digital Services Act 通知 API 合规要求。

2. 创建房间

MaxPlayers 包含主机。IsPrivate = true 表示不会出现在公开查询中,但仍能通过 ID 或加入码进入。WithRelayNetwork() 让 Sessions 配置 Relay 和 NGO 网络连接。

3. 通过加入码进入

加入码适合好友邀请。它和 Session ID 不是同一个值,不应混用。

4. 查询公开房间

只有 IsPrivate = false、未满员且可加入的 Session 会出现在查询结果中:
UI 可以遍历 results.Sessions 展示房间名和公开属性,再使用 JoinSessionByIdAsync 加入。生产环境要做分页、刷新节流和空结果状态,不要每帧查询。

5. 安全离开

LeaveAsync 会从后端成员列表移除本地玩家,并安全关闭关联的网络模块。最后一个玩家离开后,Session 会自动删除。

6. 心跳还要手写吗

使用 Multiplayer Sessions 时,SDK 会处理 Lobby 心跳和 Relay/Lobby 协调。只有维护旧版独立 Lobby SDK 的项目,才需要按照旧生命周期自行发送 Host 心跳。
不要把两套流程叠加,否则容易出现重复心跳、重复 Transport 配置和资源清理冲突。

7. 房间状态设计

建议把数据按频率分层:
数据
位置
房间名、地图、模式
Session 属性
玩家显示名、队伍、准备
Player 属性
位置、生命值、战斗状态
NGO
长期进度与背包
Cloud Save 或自建后端
不要把敏感数据设为公开 Session 属性。服务端仍需验证玩家提交的数据。

8. 错误处理

UI 调用应捕获 SessionException,并把技术错误转换成玩家能理解的状态:
  • 加入码无效
  • 房间已满或已锁定
  • 网络不可用
  • 当前账号未认证
  • 操作过于频繁
按钮在请求期间应禁用,防止重复创建或重复加入。超时后也要允许安全重试。

9. Host 离开

后端可以选举新的 Session Host,但这不代表 NGO 的实时世界已经自动迁移。原 Host 离开时,Relay 连接和 Host 内存中的权威状态仍可能丢失。需要无缝迁移时,应单独设计状态快照、迁移数据和重连流程,或使用 Dedicated Server / Distributed Authority。

系列导航

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

参考资料