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%。重连系统没有新功能,但它是联机游戏的"保险丝"。