概览
CrossingNet 是 UE 5.8 的服务器权威对局网络层:身份、匹配、对局实例、房间、结算、重连、观战与运维收在一个 C++ 插件里,蓝图只订阅事件做表现。
CrossingNet 把「开一局」拆成服务端上的固定几段:玩家进来先有身份,队列里按维度聚合成组, 大厅把组交给一个实例进程,实例进程里跑权威对局,结束时结算并回传大厅。客户端只跟房间说话, 大厅和房间之间走一条带票据的控制通道。
插件不是一套玩法框架:它不判胜负、不做 UI、不接管登录。它管的是「这一局在服务端怎么被组织、 怎么被分配到一台机器上、怎么保证结算不丢、失败之后怎么回来」。
第一次来? 按学习路径走八章:从装进项目、起大厅、拉起房间, 到客户端进房、结算、自动匹配、局域网开房与封禁。每章一个可执行案例、一条完成判据。
一眼看上去
大厅侧为一个已配对的 2v2 拉起房间进程,签发票据;房间结束时把结果传回去:
FGuid Room;
int32 Port;
FString Error;
Session->SpawnInstance(TEXT("2v2"), Room, Port, Error);
const FString Token = Session->CreateJoinToken(Room, PlayerId, ECrossingJoinRole::Player, Team);
RoomSub->EndGameWithWinner(TEXT("Completed"), 0);规模
| 项 | 值 |
|---|---|
| 插件版本 | 0.1.0 |
| 引擎 | Unreal Engine 5.8.2(源码版) |
| 运行时 / 编辑器模块 | CrossingNet / CrossingNetEditor |
| 源文件 | 68 个(.h + .cpp) |
| 配置项 | 146 个,分 13 类(CrossingNetSettings.h) |
| 蓝图事件 | 35 个(UCrossingEventsSubsystem) |
| 设置预设 | 6 份(Config/Presets/) |
| 依赖 | 无外部依赖,不依赖 OnlineSubsystem |
模块
插件按职责拆成九块,每块只回答自己那段问题:
| 模块 | 主要类 | 负责 | 不负责 |
|---|---|---|---|
| Identity | UCrossingIdentitySubsystem、ACrossingPlayerState、ICrossingAuthProvider | 分配 CrossingPlayerId 并复制;Guest 与团队账号两种来源 | 不碰 UniqueId(无 OSS 时无效) |
| Session | UCrossingSessionSubsystem | 实例进程、端口、健康探测、状态机、回收、占位、预热池、票据、重连登记、结算落盘 | 不处理身份,只按人数 |
| Room | UCrossingRoomSubsystem | 座位、准备、开局、结算、健康回复、重连、投降、系列赛、观战、迟到 | 不负责匹配和旅行 |
| Match | UCrossingMatcherSubsystem、ICrossingMatchDimension、IMatchPolicy | 队列、配对、多队、维度、Elo 窗口、自动拉起、Bot 补位 | 不直接创建实例(调 Session) |
| Party | UCrossingPartySubsystem | 建队、邀请、整队入队、队长移交、赛后返回 | 不做跨局社交关系 |
| Profile | UCrossingProfileSubsystem、UCrossingProfileStore | 档案块存储、分块传输、Elo、战绩、赛季、行为分 | 不做账号系统 |
| Admin | UCrossingAdminSubsystem | 踢人、封禁、强制结算、关实例 | 不做权限系统 |
| Events | UCrossingEventsSubsystem | 35 个蓝图事件总线 | 不保存业务状态 |
| Net | ACrossingGameMode、ACrossingPlayerController、CrossingControlProtocol | 旅行、RPC、票据校验、控制帧 | 不参与业务判定 |
| LAN | UCrossingLANSubsystem | UDP 发现、开房广播、直连加入 | 不做认证与加密 |
它解决什么
| 问题 | 插件的回答 |
|---|---|
| 谁来开房间、开在哪 | SpawnInstance 拉起实例进程,端口从 GamePortRange 里取 |
| 房间还活着吗 | 大厅每秒探一次健康端口,连续 5 次失败判卡死 |
| 玩家怎么进房 | 大厅签发 JoinToken,客户端带着票据旅行,房间校验后才分座位 |
| 掉线还能回来吗 | 座位保留到 ReconnectWindowSeconds(默认 120 秒),重连票据回到原座位 |
| 匹配怎么放宽 | Elo 窗口按 MatchEloGrowthPerSecond 随时间放宽,到 MatchMaxWaitSeconds 失败 |
| 结算丢了怎么办 | 结果带 matchId 幂等落盘,房间侧等 ACK 才停止重试 |
| 谁在乱刷 | 设备指纹只做辅助信号,弱指纹与候选指纹不自动封 |