You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

继承UActorComponent重写TickComponent报错:声明需匹配纯虚函数

解决Unreal引擎TickComponent重写的编译错误

嘿,我刚看到你的问题,这个错误其实是几个常见的新手小问题凑到一起了,别担心,很容易解决:

首先说最关键的问题——你在定义TickComponent的时候用错了作用域!你写的是void UActorComponent::TickComponent(...),但这个方法是属于你的子类(也就是你写的UClass,顺便提一句这个名字太容易和Unreal核心的UClass类混淆,建议赶紧改名,比如改成UMyActorComponent),所以正确的写法应该是用你自己的子类名作为作用域,比如void UMyActorComponent::TickComponent(...)。你现在的写法相当于试图重新定义基类的方法,而不是重写子类的方法,编译器自然会觉得你没有对应基类的虚函数声明。

然后还有两个容易忽略的细节:

  • 继承权限:Unreal的所有引擎类继承必须用public,你的类声明class UClass : UActorComponent默认是private继承,这会导致基类的TickComponent在子类中不可见,编译器根本不知道你要重写这个方法。所以必须改成class UMyActorComponent : public UActorComponent。
  • 参数匹配:检查你头文件里的声明和cpp里的定义是否和基类完全一致。比如现在Unreal的新版本里,ELevelTick已经是强类型枚举,不需要写enum关键字了,基类的定义应该是virtual void TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction);,所以你的声明和定义里也应该去掉enum,避免参数不匹配。

最后给你一个正确的示例参考:

头文件(MyActorComponent.h)

#pragma once
#include "CoreMinimal.h"
#include "Components/ActorComponent.h"
#include "MyActorComponent.generated.h"

UCLASS(BlueprintSpawnableComponent)
class YOUR_PROJECT_NAME_API UMyActorComponent : public UActorComponent
{
    GENERATED_BODY()

public:
    UMyActorComponent();

protected:
    virtual void BeginPlay() override;

public:
    // 正确的TickComponent声明
    virtual void TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction) override;
};

源文件(MyActorComponent.cpp)

#include "MyActorComponent.h"

UMyActorComponent::UMyActorComponent()
{
    // 必须开启这个属性,否则TickComponent不会被调用!
    PrimaryComponentTick.bCanEverTick = true;
}

void UMyActorComponent::BeginPlay()
{
    Super::BeginPlay();
}

// 正确的定义:用子类的作用域
void UMyActorComponent::TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction)
{
    // 别忘了调用父类的Tick逻辑
    Super::TickComponent(DeltaTime, TickType, ThisTickFunction);

    // 在这里写你的Tick逻辑
}

另外再提醒一句:如果你的组件不需要Tick,就别重写这个方法;如果需要,一定要在构造函数里把PrimaryComponentTick.bCanEverTick设为true,不然即使你重写了也不会执行。

内容的提问来源于stack exchange,提问作者Evan Gertis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:11:43