SuperAPI AI 工具集

actors-and-components

编程与开发

查看项目

更新于 11-06 16:21

技能介绍

该技能聚焦 Unreal Engine C++ 中的 Actor 与 Component 组合式设计,主张“组合优于继承”,即优先通过添加组件而非加深 Actor 类继承层级来扩展行为。

一、用途 适用于新建 AActor 或 UActorComponent 子类、搭建组件层级并选定根组件、生成 Actor、运行时增删注册组件、绑定重叠/命中事件、判断逻辑应放在构造函数还是 BeginPlay,以及排查 BeginPlay 未运行、组件无变换或不渲染、附件异常、运行时组件无效果等问题。

二、组件类型 组件分为三层:UActorComponent 为基类,无变换、不渲染不碰撞,用于纯行为/数据(生命值、背包、AI 逻辑、技能);USceneComponent 有变换但不渲染,用于变换节点、挂点、弹簧臂、相机;UPrimitiveComponent 兼具变换与渲染/碰撞,用于网格、碰撞及可绘制或物理对象。常用具体组件包括 UStaticMeshComponent、USkeletalMeshComponent、UCapsuleComponent、UBoxComponent、USphereComponent、UCameraComponent、USpringArmComponent。只有 USceneComponent 派生类才有变换、可挂接或作为根组件。

三、生命周期 典型顺序为:构造函数(设默认值、CreateDefaultSubobject 创建自有组件,运行于 CDO 与编辑器,无世界上下文)→ OnConstruction(属性变化时重跑,需幂等)→ PreInitializeComponents → 各组件 InitializeComponent → PostInitializeComponents(组件已存在并注册,可安全互连)→ BeginPlay(游戏逻辑初始化)→ Tick(需开启)→ EndPlay(清理定时器与委托)→ Destroyed 及垃圾回收阶段的 BeginDestroy/FinishDestroy。加载、PIE 复制与生成三条创建路径在 BeginPlay 前汇合,其中 PostLoad 与 PostActorCreated 互斥。

四、使用方式 代码层面要点:CreateDefaultSubobject<T>(TEXT("唯一名")) 仅限构造函数使用且名称在 Actor 内唯一;组件指针用 UPROPERTY() TObjectPtr<T> 保存以便 GC 保活并显示于编辑器;用 SetRootComponent 设置根,构造函数中用 SetupAttachment 挂接,运行时用 AttachToComponent;头文件前置声明组件类、.cpp 中包含具体头文件;重叠/命中处理函数必须是 UFUNCTION() 且签名与委托完全一致,否则 AddDynamic 静默失败。

生成 Actor 可用 SpawnActor 或 SpawnActorDeferred(在 BeginPlay 前设值后调用 FinishSpawning);通常以 UPROPERTY(EditAnywhere) TSubclassOf 暴露类以便设计师选择蓝图子类,直接生成 C++ 类会跳过蓝图默认值。运行时添加组件需 NewObject 后注册:SetupAttachment/AttachToComponent 并调用 RegisterComponent(),否则不会 Tick、渲染或碰撞。Tick 默认关闭,需在构造函数中设 PrimaryActorTick.bCanEverTick = true 或 PrimaryComponentTick.bCanEverTick = true,运行时可用 SetTickFunctionEnable 切换;建议优先使用事件/定时器。查找组件可用 GetComponentByClass 或 GetComponents。

五、适用场景与限制 文档面向 UE5(引用的行号基于 5.8,跨补丁版本会漂移但头文件路径与类/函数名稳定)。TObjectPtr 为 UE5+ 推荐写法,旧代码的裸 T* 仍可用。注意事项包括:构造函数中不得执行游戏逻辑;EndPlay 是清理定时器/委托的正确位置;Static 移动性组件运行时改变换会被忽略;生成到被阻挡位置可能返回空,需设置碰撞处理覆盖;重叠事件需在两个组件上启用碰撞与 SetGenerateOverlapEvents 且碰撞响应相互重叠。