前言
在 UE5 C++ 开发里,“选对父类”几乎决定了脚本的生命周期、可放置位置、初始化时机,以及你能用到哪些系统能力(输入、碰撞、网络复制、UI、动画等)。
这篇文章按“实战常用频率”整理:
- 常见父类分别适合做什么。
- 每类对象的核心生命周期顺序。
- 常用属性、函数和委托(含高频回调)。
说明:本文聚焦入门和日常开发高频内容,细节会因引擎版本和项目架构(单机/联机)略有差异。
1. UObject:一切反射对象的基础
适用场景
- 纯数据对象
- 工具类对象
- 不需要直接出现在场景中的逻辑对象
生命周期要点
Constructor:构造默认值。PostInitProperties:属性初始化后调用。BeginDestroy/FinishDestroy:销毁流程。
常用属性/函数
GetWorld():部分上下文可用,不是所有UObject都有有效世界。GetOuter():获取所属外部对象。IsValid()(配合对象指针检查):避免访问失效对象。
常见委托
UObject 本身没有像 Actor 那样丰富的生命周期委托,但可以参与你自定义的动态委托系统。
2. AActor:关卡中最核心的可放置对象
适用场景
- 场景实体(可见或不可见)
- 可复制的游戏逻辑载体
- 挂组件、处理交互、触发器、机关等
生命周期(常见顺序)
ConstructorOnConstruction(编辑器放置或属性变更后触发)PreInitializeComponentsPostInitializeComponentsBeginPlayTick(启用时每帧)EndPlayDestroyed
常用属性
PrimaryActorTick.bCanEverTick:是否允许 Tick。bReplicates:是否参与网络复制。NetUpdateFrequency:网络更新频率。Tags:对象标签,快速分类检索。
常用函数
BeginPlay()/Tick(float DeltaSeconds)/EndPlay()SetActorLocation()/SetActorRotation()/SetActorTransform()Destroy()HasAuthority():联机场景判断服务器权限。GetComponentsByClass():运行时检索组件。
常见委托
OnActorBeginOverlapOnActorEndOverlapOnTakeAnyDamageOnDestroyed
3. APawn 与 ACharacter:可控制角色核心
3.1 APawn
适用场景
- 可被 Controller 控制的对象
- 载具、飞行器、棋子等不一定是“人形角色”的可控实体
生命周期要点
继承 AActor 生命周期,同时常见控制链路是:
PossessedBy(AController*):被服务器控制器占有UnPossessed():解除占有SetupPlayerInputComponent():绑定输入(常见于玩家 Pawn)
常用属性/函数
AutoPossessPlayer/AutoPossessAIGetController()/GetPawnViewLocation()AddMovementInput()
常见委托
Pawn 自身内置公开委托较少,项目里通常通过组件或自定义委托广播状态变化。
3.2 ACharacter
ACharacter 是 APawn 的高频子类,内置:
CapsuleComponentCharacterMovementComponentMesh
适用场景
- 人形角色
- 需要走跑跳、重力、坡度、网络移动预测
生命周期/回调补充
Landed(const FHitResult&):落地事件Jump()/StopJumping()OnMovementModeChanged():移动模式切换
常用属性/函数
GetCharacterMovement()bUseControllerRotationYawGetMesh()
常见委托(常配合组件)
- 角色受伤/死亡常通过自定义委托或 Ability 系统委托实现
- 角色重叠事件常来自 Capsule 的
OnComponentBeginOverlap
4. AController / APlayerController / AAIController:控制层
适用场景
- 输入转发、相机控制、UI 交互(PlayerController)
- AI 决策与行为树驱动(AIController)
生命周期要点
BeginPlayOnPossess(APawn*)OnUnPossess()Tick
常用属性/函数
GetPawn()/SetViewTarget()APlayerController::GetHUD()APlayerController::ClientTravel()AAIController::RunBehaviorTree()
常见委托
OnPossessedPawnChanged(常见于 PlayerController 使用场景)
5. UActorComponent 与 USceneComponent:可复用能力模块
5.1 UActorComponent
适用场景
- 为 Actor 提供可复用能力(属性系统、锁定系统、交互系统等)
生命周期(常见)
ConstructorOnRegisterInitializeComponentBeginPlayTickComponentEndPlayOnUnregister
常用属性/函数
PrimaryComponentTick.bCanEverTickGetOwner()SetComponentTickEnabled()
常见委托
- 多数委托由具体子类组件提供(例如碰撞组件、生命组件等)
5.2 USceneComponent
USceneComponent 在 UActorComponent 基础上增加了变换层级能力。
常用函数
SetupAttachment()AttachToComponent()GetComponentLocation()SetRelativeLocation()/SetWorldLocation()
6. UPrimitiveComponent(及常见子类):碰撞与可见性核心
常见子类
UStaticMeshComponentUSkeletalMeshComponentUBoxComponent/USphereComponent/UCapsuleComponent
生命周期要点
继承组件生命周期,运行期高频关注“注册后可参与渲染/碰撞”。
常用属性/函数
SetCollisionEnabled()SetGenerateOverlapEvents()SetSimulatePhysics()SetVisibility()
常见委托
OnComponentBeginOverlapOnComponentEndOverlapOnComponentHit
7. UUserWidget:UI 脚本核心基类
适用场景
- HUD
- 菜单
- 背包、任务、提示等界面
生命周期(常见)
NativeOnInitializedNativePreConstructNativeConstructNativeTickNativeDestruct
常用属性/函数
AddToViewport()/RemoveFromParent()GetOwningPlayer()BindWidget(通过 UPROPERTY 绑定蓝图控件)
常见委托
- 按钮点击:
OnClicked - 复选框:
OnCheckStateChanged - 滑条:
OnValueChanged
8. AGameModeBase / AGameStateBase / APlayerState:规则与状态分层
AGameModeBase
- 服务器侧规则核心(客户端通常拿不到 GameMode)
- 常用函数:
StartPlay()、PostLogin(APlayerController*)
AGameStateBase
- 用于跨客户端同步的全局对局状态
- 常用:倒计时、回合状态、比赛阶段
APlayerState
- 玩家层面的可复制状态(分数、队伍、名称等)
- 角色死亡重生后常仍保留 PlayerState
生命周期提示
- 联机下要明确“规则在 GameMode,展示/同步在 GameState/PlayerState”。
9. 委托速查:最常见三类
1) 原生委托(非动态)
- 性能更好
- 不能直接暴露给蓝图
2) 动态委托(Dynamic)
- 可被反射系统识别
- 可用于蓝图绑定
- 通常比原生委托开销更高
3) 多播委托(Multicast)
- 一次广播多个监听者
- 常用于事件总线式解耦
示例(动态多播声明):
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnHealthChanged, float, NewHealth);
UPROPERTY(BlueprintAssignable, Category = "Event")
FOnHealthChanged OnHealthChanged;
10. 新手最容易踩的生命周期问题
- 在
Constructor里访问运行时对象(World、PlayerController)导致空指针。 - 组件还没注册就读碰撞/物理状态,结果和预期不一致。
- 把初始化全部塞进
BeginPlay,忽略了OnConstruction在编辑器下的价值。 - 联机逻辑没区分 Authority,导致客户端和服务器重复执行。
- 在委托解绑上遗漏
RemoveDynamic/RemoveAll,引发悬空回调。
小结
UE5 C++ 常用父类可以粗分为:
- 数据与工具层:
UObject - 场景实体层:
AActor、APawn、ACharacter - 控制层:
AController、APlayerController、AAIController - 复用能力层:
UActorComponent、USceneComponent、UPrimitiveComponent - 界面层:
UUserWidget - 对局规则与状态层:
AGameModeBase、AGameStateBase、APlayerState
掌握这些基类的“职责 + 生命周期 + 常用委托”,基本就能搭建大多数游戏玩法脚本框架。
后续可继续写:
- UE5 C++ 生命周期时序图(从对象创建到销毁)。
- 联机场景下 GameMode/GameState/PlayerState 的数据流设计。
- 角色系统实战:Character + Component + Widget 的解耦范式。