版本说明:本文使用
Unity.Services.Multiplayer 的 Sessions API。新项目不再需要自行组合 Lobby 心跳、Relay 分配和 NGO 启动;Sessions 会统一协调这些生命周期。Lobby 到底是什么1. 初始化 UGS 与认证2. 创建房间3. 通过加入码进入4. 查询公开房间5. 安全离开6. 心跳还要手写吗7. 房间状态设计8. 错误处理9. Host 离开系列导航参考资料
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。