系列导读经过前两篇你已经装好了引擎、创建了项目也熟悉了编辑器的基本操作。理解 UE 的框架类是入门开发的重中之重后续写蓝图、写 C本质上都是在与这些类打交道。第一次打开 UE 的文档或源码很容易被一堆名字吓住GameMode、GameState、PlayerController、PlayerState、Pawn、Character、HUD……它们长得都差不多到底有什么区别别担心。本篇主要讲解这些类是什么管什么在真实场景当中如何完成一整局游戏的。读完你会发现这套框架不是什么死记硬背的知识而是一套非常自然的分工设计。一、核心框架类什么在讲任何细节之前先建立整体印象。UE 的框架类本质上是在回答一个问题“一局游戏里都需要哪些角色来分工”类一句话定义类比GameMode定义游戏规则用什么角色、怎么重生、怎样算赢裁判GameState存放全局共享的游戏数据比分、剩余时间并同步给所有玩家记分牌PlayerController接收玩家输入键盘/鼠标指挥角色行动玩家的大脑PlayerState记录单个玩家的持久数据昵称、击杀数、得分玩家档案Pawn世界中被控制的身体自己不会思考身体CharacterPawn 的强化版能走能跳、带骨骼动画的角色有血有肉的身体AIControllerAI 的大脑用行为树驱动 Pawn 行动AI 的大脑HUD / UMG把游戏状态画到屏幕上血条、准星、比分板显示屏再提炼一层这八个类其实属于四个层级规则层GameMode只存在于服务器负责裁决状态层GameState全局、PlayerState个人负责让所有人看到同一份数据控制层PlayerController / AIController大脑 Pawn / Character身体负责行动表现层HUD / UMG负责展示。这里最主要的AGameMode、AGameState、APlayerController、APawn/ACharacter、AHUD/UMG打开任意关卡在菜单栏进入窗口Window→ 世界场景设置World Settings右侧面板中可以看到当前关卡使用的游戏框架类这里指定的 GameMode决定了这个关卡怎么玩——用什么角色、用什么控制器、死了怎么重生。其他几个类GameState、PlayerState、HUD 等通常在 GameMode 内部指定。类继承图UObject所有对象的基类 └── AActor世界中的实体可以放进关卡 ├── APawn可被控制/附身的载体 │ └── ACharacter带骨骼动画和移动组件的 Pawn最常用 ├── AController控制 Pawn 的大脑不在关卡中放置 │ ├── APlayerController玩家控制处理键盘/鼠标输入 │ └── AAIControllerAI 控制由行为树驱动 ├── AGameModeBase游戏规则定义者 ├── AGameStateBase全局游戏状态同步所有客户端 └── AHUD平视显示器绘制 UI二、每个类是做什么的1. AGameMode核心职责定义游戏规则。包括使用哪个角色、哪个控制器、如何重生、胜利条件是什么。常用可重写的函数函数调用时机典型用途InitGame()游戏开始时初始化全局数据PreLogin()/PostLogin()玩家连接前 / 连接后校验玩家、发放初始资源SpawnDefaultPawnFor()需要生成角色时自定义出生点选角逻辑OnActorKilled()需自行调用任意 Actor 死亡时计分、重生调度EndMatch()满足胜利条件时结束比赛在编辑器里怎么用在世界场景设置中直接指定或创建蓝图继承GameModeBase在类默认值Class Defaults里配置 DefaultPawnClass、PlayerControllerClass、GameStateClass 等。GameMode只存在于服务器。单机游戏中你就是服务器所以一切正常但做联机时客户端拿不到 GameMode——比分这类所有人都要看的数据必须放进 GameState。2. AGameState核心职责存储全局共享的游戏状态并自动复制Replication到所有客户端。剩余时间、双方比分、当前回合数都属于它。UPROPERTY(Replicated, BlueprintReadOnly) float RemainingTime; UPROPERTY(Replicated, BlueprintReadOnly) int32 TeamAScore;简单来说 GameMode 决定游戏规则判断谁赢了什么时候结束。而GameState是记录游戏状态给所有人共享数据3. APlayerController核心职责捕获输入、控制视角、管理 UI 交互。它是玩家与游戏世界之间的代理每个玩家独立拥有一个。常用功能输入处理SetupInputComponent()中绑定按键后续 获取输入篇 详解视角控制持有 CameraManager管理相机震动、淡入淡出UI 交互管理鼠标显示/隐藏、SetInputMode游戏模式 / UI 模式获取玩家状态GetPlayerStateAPlayerState()拿到自己的战绩数据。4. APawn 与 ACharacterAPawn世界中被控制的实体本身没有智能。它提供AddMovementInput()等移动接口但什么时候移动要听 Controller 的。ACharacter最常用的 Pawn 子类额外拥有CharacterMovementComponent处理走/跑/跳/游泳/飞行的移动组件内置网络同步和碰撞SkeletalMesh骨骼网格体挂上角色模型胶囊体碰撞CapsuleComponent角色的根碰撞。简单来说Pawn像是一个句柄控制物体如何移动Charactor是任务角色的类。Pawn 与 Controller 的接口Controller 通过Possess()附身 Pawn通过UnPossess()离开。附身之后Pawn 收到的输入才有效。5. AHUD 与 UMGAHUD传统的画布绘制类通过DrawHUD()用代码画准星、血条。现代项目更多把它当作 UMG 的宿主。UMGWidget基于控件的 UI 系统用 UUserWidget 做血条、背包、计分板是实际开发的主流选择。HUD 小节先了解概念即可后续会专门展开UMG的详细介绍。6. APlayerState核心职责记录单个玩家的持久数据昵称、ID、击杀数、死亡数、得分。和 GameState 的区别GameState 存全局局势哪队领先PlayerState 存个人战绩你杀了几个人。联机时每个客户端都有一份所有玩家的 PlayerState 副本。7. AAIController与 PlayerController 平级但不做输入处理而是由**行为树Behavior Tree和黑板Blackboard**驱动。核心函数RunBehaviorTree()启动行为树MoveToActor()/MoveToLocation()寻路移动。这也是身体与大脑分离设计的最大受益者让 AI 接管一个玩家角色只需AIController-Possess(Character)角色代码一行不用改。这里暂时不考虑理解这个AIController简单了解就可以三、理解一局游戏是如何运行的了解了每个类的定义现在把它们放回一个真实场景中场景玩家启动游戏 → 进入一个对战地图 → 控制角色移动 → 击杀敌人获得分数 → 游戏结束时显示胜负。1. GameMode玩家启动游戏、地图加载GameMode第一个登场。它像开赛前检查场地的裁判这场比赛用哪个地图、每位玩家操控什么角色DefaultPawnClass、由什么控制器接管PlayerControllerClass都是它说了算。2. Controller 附身 Pawn玩家连接进来GameMode依次生成两样东西一个PlayerController和一个Character。然后 PlayerController 对 Character 执行Possess附身——从这一刻起按键才有了意义。同时GameMode 还生成了一份PlayerState玩家档案里面登记着这位玩家的昵称和初始战绩。3. 按键如何变成移动玩家按下 W 键流程是PlayerController最先收到输入事件它调用 Character 的移动接口AddMovementInput()CharacterMovementComponent真正执行移动并把结果通过网络复制给其他客户端。注意Character 自始至终没决定过任何事它只是执行者4. 数据存储在哪里玩家击杀一名敌人数据兵分两路个人战绩击杀数 1→ 写入PlayerState。因为战绩属于这位玩家且要跟随他直到对局结束队伍比分 → 写入GameState。因为比分属于 全局数据 且必须同步到所有客户端。GameMode 此时并不存数据它只负责裁决听到击杀事件后检查胜利条件是否达成。5. 判断游戏结束胜利条件达成*GameMode*判定比赛结束广播结束事件。结果经由*GameState*同步到每个客户端最终由*HUD / UMG*把胜利画面画到每位玩家的屏幕上。1. 玩家启动游戏 → GameMode 决定使用哪个地图、哪个 Pawn、哪个 Controller 2. 玩家进入游戏PostLogin → GameMode 生成 Pawn、PlayerController 和 PlayerState → Controller 附身PossessPawn 3. 玩家操作按 W 键 → PlayerController 捕获键盘输入 → 调用 Pawn 的移动函数AddMovementInput → CharacterMovementComponent 执行移动并复制给其他客户端 4. 玩家击杀敌人 → 更新 PlayerState 中的击杀数个人战绩 → 更新 GameState 中的队伍比分全局局势 → GameMode 检查胜利条件 5. 游戏结束 → GameMode 判定结束并广播事件 → GameState 同步结果 → HUD / UMG 显示胜负界面玩家按键 → PlayerController接收→ Pawn/Character执行→ 数据写入 PlayerState个人/ GameState全局→ GameMode 裁决 → UI 展示四、生命周期梳理整个流程会发现这些类的生命周期是不一样的对象创建者生命周期GameMode引擎关卡加载时随关卡仅服务器GameStateGameMode随关卡所有端PlayerControllerGameMode玩家加入时玩家连接期间PlayerStateGameMode玩家加入时整个对局跨重生Pawn / CharacterGameMode重生时一次生命死亡即销毁HUDPlayerController随本地玩家