想弄清楚虚幻引擎中游戏模式(GameMode)、游戏状态(GameState)和玩家状态(PlayerState)这三个核心类的区别,以及它们各自的作用和使用场景,这是 UE 多人游戏开发中最容易混淆的几个概念,理清它们的分工能让你的游戏逻辑架构更清晰。

先通过表格直观对比三者的核心差异,帮你建立基础认知:
表格
通俗理解:游戏的 “裁判长”,只在服务器端工作,全程掌控游戏规则,不参与数据同步。
核心场景:
定义玩家的生成规则:比如玩家死亡后是否重生、重生延迟、重生点在哪(重写SpawnPlayerPawn方法)。
管理游戏流程:比如开局倒计时、胜利 / 失败条件判断(如一方分数达到 100 则游戏结束)。
验证玩家操作:比如限制玩家只能在特定阶段攻击、判断玩家的行为是否违规。
自定义游戏规则:比如 TDM(团队死斗)、吃鸡模式的核心逻辑都写在 GameMode 里。
示例:在 FPS 游戏中,GameMode 里写逻辑:“当红队总分≥50 时,触发游戏结束,判定红队胜利”,并通知 GameState 更新全局比分状态。
通俗理解:游戏的 “公共公告屏”,服务器维护一份权威数据,同步给所有客户端,所有人都能看到。
核心场景:
存储全局共享数据:比如当前游戏时间、双方比分、游戏阶段(准备 / 战斗 / 结束)、存活玩家数量。
广播全局事件:比如 “游戏开始”“某队得分”“游戏结束” 等事件,让所有客户端的 UI 同步更新。
管理全局对象:比如存储所有活跃的玩家 Pawn、所有刷新的道具列表(供客户端查询)。
示例:GameState 中创建变量RedTeamScore和BlueTeamScore(设置为 Replicated 同步),当 GameMode 判定红队得分时,修改 GameState 的RedTeamScore,所有客户端的 UI 就能实时显示最新比分。
通俗理解:单个玩家的 “身份证 + 成绩单”,每个玩家有独立的实例,数据同步给所有客户端,能看到其他玩家的状态。
核心场景:
存储玩家专属且需要同步的数据:比如玩家的击杀数、死亡数、等级、金币、所属阵营、昵称。
跨 Pawn 保留数据:玩家的 Pawn(角色)死亡重生后,PlayerState 不会销毁,因此击杀数、等级等数据不会丢失(Pawn 销毁不影响 PlayerState)。
供其他玩家查看:比如在多人游戏中,玩家能看到队友 / 敌人的击杀数(通过读取对方的 PlayerState)。
示例:PlayerState 中创建变量KillCount(Replicated 同步),玩家击杀敌人时,在服务器端修改自己 PlayerState 的KillCount,所有客户端都能在排行榜 UI 中看到该玩家的击杀数;即使玩家重生换了 Pawn,KillCount依然保留。
不要在 GameMode 中存储需要同步的数据:因为客户端没有 GameMode 副本,客户端无法直接访问 GameMode 的变量,强行访问会报错。
不要在 PlayerState 中存储全局数据:比如总比分,PlayerState 是玩家专属的,全局数据应该放在 GameState。
同步变量必须标记为 Replicated:GameState 和 PlayerState 的变量要同步,必须在蓝图 / 代码中勾选 “Replicate”(复制),否则客户端看不到最新数据。
客户端不要修改 GameState/PlayerState 的核心数据:所有数据修改必须在服务器端执行,客户端仅做读取和显示,避免数据不一致。
GameMode 是服务器端的 “规则裁判”,负责游戏流程和规则,无同步,1 个实例;
GameState 是全局的 “同步公告板”,存储全服共享数据,同步给所有客户端,1 个实例;
PlayerState 是玩家的 “同步身份卡”,存储玩家专属数据,跨 Pawn 保留,每个玩家 1 个实例。
核心逻辑:规则(GameMode)→ 全局数据(GameState)→ 玩家个体数据(PlayerState),三者分工明确,是 UE 多人游戏架构的核心基础。