Unreal Engine 5.8 的服务器权威对局网络层
CrossingNet
身份、匹配、对局实例、房间状态、结算、重连、观战与运维,收在一个 C++ 插件里。大厅进程负责开房与分配,房间进程跑权威对局,两边走一条带票据的控制通道;蓝图只订阅事件做表现,不参与判定。
// 大厅:为一个已配对的 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);大厅拉起房间、签发票据,房间结束时把结果传回去
长什么样
一份配置,就是一套对局后端
下面这段来自 Config/DefaultGame.ini:端口段、控制通道、匹配窗口、票据与重连窗口各占几行。改完重启,大厅就能按这张表拉起房间、探测健康、匹配、回收空实例。
[/Script/CrossingNet.CrossingNetSettings]ServerExePath=D:/.../UnrealEditor.exeGamePortRange=(X=57100,Y=57150)HealthPortRange=(X=58100,Y=58150)LobbyControlAddress=127.0.0.1:57300+ModeConfigs=(Mode="2v2",TeamSize=2,TeamCount=2)MatchBaseEloWindow=100.0MatchEloGrowthPerSecond=20.0bRequireJoinToken=TrueJoinTokenTtlSeconds=300ReconnectWindowSeconds=120.0bEnableWarmPool=TrueWarmPoolMode=1v1MaxInstances=8大厅进程按这段配置开房、探测、匹配与回收
CrossingNet.Status # 实例表与匹配队列快照
工作流
从身份到结算,一条链路走完
插件把一局对局的每个阶段都放在服务端:玩家进来先有身份,队列里按维度聚合,配到的组被分给一个实例,房间进程跑权威对局,结束时结果回传并落盘。
身份
PostLogin 分配 CrossingPlayerId 并复制到客户端;ICrossingAuthProvider 可换成团队账号系统,Guest 默认就能玩,非 Guest 不接受自报 ID。
组队与匹配
单人和预组队进同一个队列,维度、Elo 窗口与等待上限按 tick 放宽;配到的组认领预热实例或新拉一个,拉起期间还占着位。
开局
大厅签发 JoinToken,客户端旅行进房;房间校验票据、按角色分座位,重连角色回到原座位而不是判负,迟到与观战各有边界。
结算与运维
EndGame 后结算 Elo 与档案,结果带 matchId 幂等落盘;房间侧等到 ACK 才停止重试,日志按天轮转,空实例有宽限期再回收。
模块
七个模块,各管一段
插件按职责拆成模块,每个模块只回答自己那段问题;扩展点是 C++ 接口,蓝图侧只看到事件。