在Unreal Engine中,应继承UActorComponent创建自定义组件,通过暴露变量与函数供蓝图调用,支持构造时添加或运行时动态挂载,并可结合Gameplay框架扩展功能。
在Unreal Engine中,通过C++继承 UActorComponent(而非直接使用UComponent,因UComponent是抽象基类)来创建自定义功能模块,是最标准、最灵活的方式。核心思路是:将游戏逻辑封装为可复用、可挂载、可蓝图调用的组件,再通过C++实现高性能或底层功能。
UActorComponent 是所有可附加到Actor上的功能组件的基类(如USceneComponent、UStaticMeshComponent等都继承自它)。你需要新建一个C++类,选择“Actor Component”作为父类:
UCLASS() 和 UActorComponent 继承声明,并启用蓝图可访问(Blueprintable)PrimaryComponentTick.bCanEverTick = true(如需每帧更新),并设置 bWantsInitializeComponent = true(如需初始化逻辑)让组件真正“可用”,关键在于正确暴露接口:
UPROPERTY(BlueprintReadWrite, VisibleAnywhere) 暴露状态变量(如 float CurrentHealth),支持蓝图读写和细节面板显示UFUNCTION(BlueprintCallable) 暴露功能函数(如 void TakeDamage(float DamageAmount)),供蓝图或其它C++代码调用InitializeComponent() 处理组件挂载时的初始化(如绑定事件、获取引用);重写 OnRegister() 或 OnUnregister() 管理资源生命周期组件可在运行时通过C++代码挂载到Actor上,无需编辑器拖拽:

APlayerCharacter),使用 GetWorld()->SpawnActor() 不适用——组件必须依附于Actor;应改用:UHealthComponent* HealthComp = CreateDefaultSubobject(TEXT("HealthComp")); (仅限构造函数)MyActor->AddComponentByClass(UHealthComponent::StaticClass(), true, FTransform::Identity, false);,返回 UActorComponent*,需 Cast() 使用UHealthComponent* Comp = MyActor->FindComponentByClass(); 或 MyActor->GetComponentByClass(UHealthComponent::StaticClass());
若需与Gameplay Ability System(GAS)、AttributeSet、GameplayEffect等协同,建议组件继承自 UGameplayTask、UGameplayAbility 或聚合 UAbilitySystemComponent:
UFootstepAudioComponent 可监听移动事件,触发音频+地面材质反馈UInteractionComponent 可封装射线检测、距离判定、交互提示逻辑,并通过 BeginPlay() 注册输入事件或Tick委托TWeakObjectPtr 或通过 GetOwner() 动态获取