非AActor类的Tick实现
- 继承虚基类FTickableGameObject
#include "Tickable.h" class ConsoleVarManager : public FTickableGameObject { //... }
- 实现虚函数Tick
virtual void Tick(float DeltaTime) override { //do something in Tick }
- 实现GetStatId (用于性能监测与调试标记)
virtual TStatId GetStatId() const override { RETURN_QUICK_DECLARE_CYCLE_STAT(ConsoleVarManager, STATGROUP_Tickables); }
在FTickableGameObject的构造函数内实现了注册该类至TickableObjects
FTickableGameObject::FTickableGameObject()
{
FTickableStatics& Statics = FTickableStatics::Get();
if (UObjectInitialized())
{
Statics.QueueTickableObjectForAdd(this);
}
else
{
AddTickableObject(Statics.TickableObjects, this);
}
}
因此可知继承了FTickableGameObject的类需要首先执行父类的构造函数才能被注册调用Tick的方法。 这里举例挂载到了GameInstance内
#pragma once
#include "CoreMinimal.h"
#include "Engine/GameInstance.h"
#include "ConsoleVarManager.h"
#include "MyGameInstance.generated.h"
/**
*
*/
UCLASS()
class PLUGINSLEARN_API UMyGameInstance : public UGameInstance
{
GENERATED_BODY()
ConsoleVarManager* ConsoleManager;
virtual void Init() override
{
ConsoleManager = new ConsoleVarManager();
UE_LOG(LogTemp,Warning,TEXT("UMyGameInstance Init"));
Super::Init();
}
virtual void Shutdown() override
{
delete ConsoleManager;
ConsoleManager = nullptr;
UE_LOG(LogTemp,Warning,TEXT("UMyGameInstance Shutdown"));
Super::Shutdown();
}
};
或者直接多继承UObject,在引擎构造该类的ODC即调用了父类的构造函数。