继承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
相关产品推荐
相关产品推荐

