5.3 会话与断线重连:接得上、断不了、回得来
核心结论
联机体验的底线不是"低延迟",而是"接得上、断不了、回得来":创建/加入房间的流程顺滑、网络波动不断线、断了能回来继续。会话层(OnlineSubsystem Session,官方文档 https://www.wanxiangyundang.top/read/unreal-engine-5-8-docs/online-subsystem-session-inter-ec94)负责前两件,断线重连是我们自己写的第三件。
会话三件事
| 功能 | 接口 | 我的选择 |
|---|---|---|
| 创建房间 | CreateSession | LAN + Steam(双 OSS) |
| 查找/加入 | FindSessions/JoinSession | 列表 UI + 直连代码 |
| 房间管理 | Kick/Migrate Host | 迁移主机见 0501 |
OSS 的选择策略:
- 开发期:Null/LAN(零配置)。
- 上线:Steam(玩家都在 Steam,且房间/好友邀请开箱即用)。
- 跨层:用接口编程,一行配置切换(DefaultEngine.ini 的 OnlineSubsystem 名)。
匹配 vs 房间列表
| 方式 | 适合 | 成本 |
|---|---|---|
| 房间列表 | 朋友/社区向 | 低 |
| 快速匹配 | 陌生人快速开局 | 中(要写匹配规则) |
| 大厅 +房间 | 完整社交体验 | 高 |
独立项目建议房间列表——Roguelike 是局制的,"和朋友开一局"是主场景,匹配是伪需求。
断线重连:三层设计
| 层 | 做什么 | 玩家感受 |
|---|---|---|
| 检测层 | 心跳/连接回调,2s 无响应判断断开 | "好像卡了" |
| 保持层 | 断线 5 分钟内保留房间与角色状态 | "我还能回去" |
| 恢复层 | 重连成功后服务器补发快照 | "无缝继续" |
关键设计: - 断线≠退出:玩家断线时角色留在世界(其他玩家看到"断线中"),不立即销毁。 - 重连快照:重连后服务器打包当前房间状态一次性下发,而不是让客户端"追历史"(0502 的快照思路)。 - 超时迁移:房主断线 30s,自动迁移主机或结束会话并保存。
UI 与提示
断线/重连是情绪最脆弱的时刻("我的进度没了?")。UI 三原则: 1. 明确告知:"网络连接中断"而不是"错误"或静默卡死。 2. 给希望:显示"正在重连(剩余 4:58)"倒计时。 3. 给退路:"返回主菜单(进度已保存)"永远可达。
常见坑与解法
坑 1: joining 后黑屏
原因:加入会话后服务器没 lobby,客户端没准备地图流。
解法:加入流程标准化:JoinSession -> ClientTravel 到大厅/关卡 -> 监听服务器自动托管。在UI 加 Loading 覆盖,别让玩家看黑屏猜。
坑 2:掉线后重连,发现自己角色"没了"
原因:断线时销毁了 Pawn 与存档内存状态。
解法:断线保留角色(加 Tag State.Disconnected、设Timeout),重连按 Tag 恢复。销毁前先问"会不会有人回来"。
坑 3:NAT/打洞连不上(房主制常见)
解法: - 用平台 OSS(Steam 的中继)。 - 或上一台中继 DS(便宜,远比 P2P 打洞稳)。 - 自建打洞不现实——独立项目别自己写 NAT 穿透。
坑 4:重连后任务/奖励重复发
原因:重连走了一遍"初次登录"流程。
解法:重连标志:会话里区分"新加入"与"重连",重连跳过登录奖励、发快照。状态机里把重连当分支处理一次,而不是复用登录。
相关节点速查
- 官方会话:https://www.wanxiangyundang.top/read/unreal-engine-5-8-docs/online-subsystem-session-inter-ec94
- 心跳/连接事件:
OnConnectionClosed/ 会话接口 - 客户端迁移:
ClientTravel
心得:上线后数据告诉我们一个反直觉的事实:平均每局有 1.3 次断线( wifi 切换、切后台)。做了断线重连后,"因断线而退游"的比例从 22% 降到 4%。重连系统没有新功能,但它是联机游戏的"保险丝"。
