如何申请EngineTick及GameTick简介
UE中申请Tick的方法有四种(目前笔者知道的。。。)
EngineTick
1.FTSTicker(原名FTicker,已废弃)
FTSTicker的特点是其Tick的生命周期同Engine一样长。
申请方式:
class UManagerSubsystem : public UEngineSubsystem,public FTSTicker
{
public:
UManagerSubsystem();
~UManagerSubsystem();
private:
FTSTicker::FDelegateHandle TickHandler;
}
UManagerSubsystem.cpp
void UManagerSubsystem()
{
// 注册定时任务回调函数
if (!TickHandler.IsValid()) {
TickHandler = FTSTicker::GetCoreTicker().AddTicker(FTickerDelegate::CreateUObject(this,&UBTHFSMManagerSubsystem::MyTickFunction));
}
}
void ~UManagerSubsystem()
{
FTSTicker::GetCoreTicker().RemoveTicker(TickHandler);
}
UBTHFSMManagerSubsystem.h
bool MyTickFunction(float DeltaTime)
UBTHFSMManagerSubsystem.cpp
// 自定义的定时任务回调函数
bool MyTickFunction(float DeltaTime)
{
// 在这里执行你的定时任务
UE_LOG(LogTemp, Warning, TEXT("MyTickFunction executed!"));
// 返回 true 表示继续执行该任务,返回 false 表示不再执行该任务,并且会从队列中移除!
return true;
}
注意:如果在Tick的函数内容中返回False,则该定时任务就会从队列中移除,所以一定要小心。
GameTick
这里笔者比较懒,就先贴上个人常用的,耦合最少的方法。使用方法类似上文
1.ActorTick(待补充)
2.TimeManager(待补充)
3.FTickableGameObject
class UManagerSubsystem : public UEngineSubsystem,public FTickableGameObject
{
public:
virtrual void Tick(float DeltaTime) override;
virtrual TStatId GetStatId() const override;
private:
FTSTicker::FDelegateHandle TickHandler;
}
void UManagerSubsystem::Tick(float DeltaTime)
{
//此处执行你的任务内容
UE_LOG(LogTemp, Warning, TEXT("MyTickFunction executed!"));
}
TStatId UManagerSubsystem::GetStatId() const
{
RETURN_QUICK_DECLARE_CYCLE_STAT(UManagerSubsystem, STATGROUP_Tickables);
}
相关参考
Tick剖析