公会团本联机同步 private
公会团本联机同步
本栏目只讲
emBattleType.GameGuildPveBoss = 15。重点不是玩法策划,而是一个公会的多个客户端怎样进入同一个 Battle Actor、怎样获得当前战场、怎样持续同步、怎样重连,以及战斗结束后怎样和 Lobby/Redis 对账。
- 阅读同步时要区分两条权威边界:Battle 保存共享实体/属性/结算并负责校验转发;当前 Host 客户端运行怪物 AI 和移动技能决策。
一句话模型
团本不是每个成员各开一份副本,而是一个公会在当前 Boss 轮次复用同一个 BattleId。这个 BattleId 最终定位到战斗服中的一个 BattleGuildPveBoss Actor。
公会轮次与入口:Lobby + Redis
实时战斗真相:BattleGuildPveBoss Actor
客户端画面:SceneInfo 首帧 + AddEntity 快照 + 后续增量包
flowchart LR
C1[公会成员 A] --> L[Lobby]
C2[公会成员 B] --> L
L --> R[(公会 Redis)]
L --> M[BattleMgr]
M --> B[BattleGuildPveBoss Actor]
C1 <--> B
C2 <--> B
B -->|约 5 秒一次 Boss 摘要| R
B -->|结算| L
阅读顺序
| 顺序 | 页面 | 解决的问题 |
|---|---|---|
| 1 | 创建、BattleId 路由与中途加入 | 为什么所有公会成员能进入同一场战斗 |
| 2 | 首帧快照、AOI 与实时增量 | 新客户端怎样看到已经打了一半的 Boss 与队友 |
| 3 | 断线重连、复活与结算 | 网络断开、团灭和胜利时各端怎样收口 |
| 4 | 并发锁、故障边界与排错 | 当前实现能保证什么,不能保证什么,代码里有哪些风险 |
四条最重要的结论
BattleGuildPveBoss继承BattleStateSync,所以移动、属性、技能、Buff、伤害、实体创建/删除并不是团本专用协议,而是复用通用战斗状态同步。- Redis 里的
curRoundInfo不是实时战斗存档。实时 Boss HP 通过SyncProperty等战斗包送给场内客户端;Redis 只保存约 5 秒粒度的跨服务摘要。 - 当前代码有“重连到还活着的 Actor”的能力,但没有“Battle Actor 崩溃后按 Redis 快照重建原战斗”的完整能力。
- 团本怪物不是由独立 Battle 服务器运行完整 AI:Battle 保存 Monster 和控制权,服务端选出的 Host 客户端运行 EnemyStateMachine,再把移动、状态和位置同步回 Battle。
核心源码
客户端
Assets/Code/Game/UI/Generated/UIGuildBossPanel/UIGuildBossPanel.csAssets/Code/Game/World/Modules/Gameplay/Class/GuildBoss.csAssets/Code/Game/Temp/CS_ReceiveBattleGameDataSystem.csAssets/Code/Game/Temp/StateSyncSystem.csAssets/Code/Game/Temp/BattleDataSyncSystem.csAssets/Code/Game/Temp/ReviveSystem.csAssets/Code/Game/Temp/SettlementSystem.cs
服务端
Server/NodeLobby/SystemBattle/SystemBattle.csServer/NodeLobby/SystemLobby/ComLobbyStatus.csServer/NodeLobby/GameGuild/ComGameGuild.csServer/NodeBattle/Root.csServer/NodeBattle/Room/Battle/GamePlay/BattleGuildPveBoss.csServer/NodeBattle/Room/Battle/BattleStateSync.csServer/NodeBattle/Handle/BattleStateSyncEvent.csServer/NodeBattle/Handle/HandleMessage.csServer/NodeBattle/BattleEntity/SceneComponent/CellMgr.cs
协议
Packet_tool/Packet_Battle.protoPacket_tool/Packet_Battling.protoPacket_tool/Packet_Common.protoPacket_tool/ServerBattleMgr.protoPacket_tool/ServerPacket.proto