uactorcomponent

UActorComponent

🛠️ Unreal Engine - UActorComponent


🏷 定义

  • UActorComponentActor 的组件基类
  • 不能直接出现在世界中,而是附加到 AActor 上,为 Actor 提供功能和行为。
  • 用于实现 可复用逻辑或功能模块,如渲染、物理、音效、输入等。
  • 组合式设计的核心,允许 Actor 通过组件扩展功能而无需继承。

🧩 类继承关系

UObject

└── UActorComponent

  ├── UPrimitiveComponent

  │     ├── UStaticMeshComponent

  │     ├── USkeletalMeshComponent

  │     └── UAudioComponent

  ├── UCameraComponent

  └── ULightComponent

  • UObject:基础对象类
  • UActorComponent:Actor 可附加组件基类
  • UPrimitiveComponent:带渲染和碰撞的组件基类
  • UStaticMeshComponent:静态网格渲染
  • USkeletalMeshComponent:骨骼网格渲染
  • UAudioComponent:声音播放组件
  • UCameraComponent:摄像机组件
  • ULightComponent:灯光组件

⚙️ 关键特性

  • 可附加到 Actor
    • Actor 可以有多个组件,每个组件负责特定功能
    • 通过 CreateDefaultSubobject<>() 或蓝图添加
  • 生命周期管理
    • 核心回调:
      • InitializeComponent():组件初始化
      • BeginPlay():Actor 开始游戏时调用
      • TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction):每帧更新
      • EndPlay(const EEndPlayReason::Type EndPlayReason):结束时调用
  • 可复用与模块化
    • 一个组件可以被多个 Actor 重用
    • 支持自定义逻辑和状态
  • Tick 支持
    • 可设置 PrimaryComponentTick.bCanEverTick = true
    • 实现每帧逻辑,如 AI、移动、动画更新
  • 网络复制支持
    • 可通过 bReplicatesbReplicateMovement 在客户端/服务器同步状态
  • 属性可编辑与序列化
    • 使用 UPROPERTY() 暴露属性给蓝图或编辑器
    • 可序列化、保存游戏、支持 GC

📝 使用方法

1. 创建组件

1
2
3
4
5
6
7
// 头文件
UPROPERTY(VisibleAnywhere)
UStaticMeshComponent* MeshComponent;

// CPP构造函数
MeshComponent = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("MeshComponent"));
RootComponent = MeshComponent;

2. 生命周期回调

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
void UMyComponent::InitializeComponent()
{
    Super::InitializeComponent();
    UE_LOG(LogTemp, Warning, TEXT("Component initialized"));
}

void UMyComponent::BeginPlay()
{
    Super::BeginPlay();
    UE_LOG(LogTemp, Warning, TEXT("Component BeginPlay"));
}

void UMyComponent::TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction)
{
    Super::TickComponent(DeltaTime, TickType, ThisTickFunction);
    // 每帧逻辑
}

3. 附加到 Actor

1
2
3
4
5
AMyActor::AMyActor()
{
    MyComponent = CreateDefaultSubobject<UMyComponent>(TEXT("MyComponent"));
    RootComponent = MyComponent;
}

📚 常见子类与用途

用途
UPrimitiveComponent带渲染和碰撞的组件基类
UStaticMeshComponent静态网格渲染和碰撞
USkeletalMeshComponent骨骼网格动画渲染
UAudioComponent播放声音和音效
UCameraComponent摄像机功能
ULightComponent灯光功能
USceneComponent提供位置、旋转、缩放变换支持的基础组件

📦 小结

  • UActorComponent = Actor 的功能模块化基类
  • ✅ 不能单独出现在世界中,需要附加到 Actor
  • ✅ 提供生命周期回调、Tick、网络同步
  • ✅ 可复用、可扩展、可序列化
  • ✅ 是实现组合式 Actor 架构的核心