在跟随Udemy课程《Unreal Engine 5 C++ The Ultimate Game Developer Course》的过程中,碰到了各种因为UE本身或者版本问题导致即使步骤一致,但执行一直出错的情况,遂列举出来,希望对同样碰到这些问题的伙伴有所帮助。

Tick 失效每帧无改变

在课程中原本代码为PrimaryActorTick.bCanEverTick = true;但这个并没用,即使更改了 void AItem::Tick(float DeltaTime)函数,里面的内容在UE运行后没有任何显示。应该更改的是bStartWithTickEnabled参数:

c++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
AItem::AItem()
{
// Set this actor to call Tick() every frame. You can turn this off to improve performance if you don't need it.
//PrimaryActorTick.bCanEverTick = true;
PrimaryActorTick.bStartWithTickEnabled = true; // Changed code
}
// Called every frame
void AItem::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);

if (GEngine)
{
GEngine->AddOnScreenDebugMessage(1, 60.f, FColor::Cyan, FString::Printf(TEXT("DeltaTime: %f"), DeltaTime));
}
}

或者,如果只用蓝图Blueprint,那么需要在“Event Tick”node节点上,Exec连接”Set Actor Tick Enabled”,并将“Enabled”勾上即可。

Build报错function override error

如果在下面这些function或者更多地方出现”Member function declared with ‘override’ does not override a base class member”错误。而你又没有更改过它们这些function。

plaintext
1
2
3
4
5
6
7
virtual bool SerializeBulkData(class FBulkData& BulkData, const struct FBulkDataSerializationParams& Params) override
virtual bool SetCompressionMap(TArray<FCompressedChunk>* CompressedChunks, ECompressionFlags CompressionFlags) override
virtual FArchive& operator<<(FLazyObjectPtr& Value) override { return SerializeLazyObjectPtr(*this, Value); }
virtual FArchive& operator<<(FObjectPtr& Value) override { return SerializeObjectPtr(*this, Value); }
virtual FArchive& operator<<(FSoftObjectPtr& Value) override { return SerializeSoftObjectPtr(*this, Value); }
virtual FArchive& operator<<(FSoftObjectPath& Value) override { return SerializeSoftObjectPath(*this, Value); }
virtual FArchive& operator<<(FWeakObjectPtr& Value) override { return SerializeWeakObjectPtr(*this, Value); }

那么就是UE的live coding在捣鬼。回到UE界面中,找到右下角像“俄罗斯方块”的标志,鼠标移到上面显示“Recompiles and reloads C++ blabla”, 点右边三个点,关掉live coding就好了。之后编译直接点一下这个按钮就行。(不知UE为啥这么多bug)