SetTimer
与SetTimerForNextTick
两个接口管理所有的Timer,存在于UGameInstance实例中,每个场景物品都可以获取,获取方法如下:
GetGameInstance()->GetTimerManager();
GetWorld()->GetTimerManager();
GetWorldTimerManager();
本质上都是通过UGameInstance::GetTimerManager()来获取
inline FTimerManager& GetTimerManager() const
{
return (OwningGameInstance ? OwningGameInstance->GetTimerManager() : *TimerManager);
}
FTimerManager& AActor::GetWorldTimerManager() const
{
return GetWorld()->GetTimerManager();
}
Timer的句柄,用于暂停,恢复,取消Timer,对Timer进行管理
FTimerHandle TestTimerHandle;
GetWorldTimerManager().PauseTimer(TestTimerHandle);
GetWorldTimerManager().UnPauseTimer(TestTimerHandle);
GetWorldTimerManager().ClearTimer(TestTimerHandle);
//取消指定对象的所有Timer
GetWorldTimerManagerr().ClearAllTimersForObject(this);
//Get Rate TimerHandle无效返回-1
GetWorldTimerManager().GetTimerRate(TestTimerHandle);
//是否暂停
GetWorldTimerManager().IsTimerPaused(TestTimerHandle);
//是否活跃且未暂停
GetWorldTimerManager().IsTimerActive(TestTimerHandle);
//是否存在且等待运行
GetWorldTimerManager().IsTimerPending(TestTimerHandle);
//是否存在
GetWorldTimerManager().TimerExists(TestTimerHandle);
//剩余时间 TimerHandle无效返回-1
GetWorldTimerManager().GetTimerRemaining(TestTimerHandle);
//已运行时间 TimerHandle无效返回-1
GetWorldTimerManager().GetTimerElapsed(TestTimerHandle);
有6个重载
//Callback 类的成员函数
void SetTimer
(
FTimerHandle& InOutHandle,
UserClass* InObj,
typename FTimerDelegate::TUObjectMethodDelegate< UserClass >::FMethodPtr InTimerMethod,
//typename FTimerDelegate::TUObjectMethodDelegate_Const< UserClass >::FMethodPtr
float InRate,
bool InbLoop = false,
float InFirstDelay = -1.f
);
//Callback Delegate的Bind函数
void SetTimer
(
FTimerHandle& InOutHandle,
FTimerDelegate const& InDelegate,
//FTimerDynamicDelegate const& InDynDelegate
float InRate,
bool InbLoop,
float InFirstDelay = -1.f
);
DECLARE_DELEGATE(FTimerDelegate);//无法带参数
DECLARE_DYNAMIC_DELEGATE(FTimerDynamicDelegate);//无法带参数
//Callback空气,不知道有啥用
void SetTimer
(
FTimerHandle& InOutHandle,
float InRate,
bool InbLoop,
float InFirstDelay = -1.f
);
//Callback TFunction,常用于Lambda函数(可捕获参数)
void SetTimer
(
FTimerHandle& InOutHandle,
TFunction&& Callback,
float InRate,
bool InbLoop,
float InFirstDelay = -1.f
);
笔者认为使用时可分为三类,下面举例说明:
首先定义一个测试函数
void ATimerHandleTest::TimerPrintTest()
{
UE_LOG(LogTemp, Warning, TEXT("Timer Callback"));
}
类的成员函数
GetWorldTimerManager().SetTimer(TestTimerHandle, this, &ThisClass::TimerPrintTest, 2.0f, true);
Delegate
DECLARE_DELEGATE(FTestTimerHandle);
FTestTimerHandle TestTimerHandleDelegate;
TestTimerHandleDelegate.BindUObject(this, &ThisClass::TimerPrintTest);
GetWorldTimerManager().SetTimer(TestTimerHandle, TestTimerHandleDelegate, 2.0f, true);
TFunction
这里用Lambda函数举例
float t = 10.f;
GetWorldTimerManager().SetTimer(
TestTimerHandle,
[t] {
GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Yellow, FString::Printf(TEXT("Timer Callback:%f"), t));
},
2.f, true);
其他参数解释:
下一帧就会触发Callback,不是很常用,一共有5种重载,和SetTimer使用方法基本一致
FTimerHandle SetTimerForNextTick
(
UserClass* inObj,
typename FTimerDelegate::TUObjectMethodDelegate< UserClass >::FMethodPtr inTimerMethod
//typename FTimerDelegate::TUObjectMethodDelegate_Const< UserClass >::FMethodPtr inTimerMethod
);
FTimerHandle SetTimerForNextTick(FTimerDelegate const& InDelegate);
FTimerHandle SetTimerForNextTick(FTimerDynamicDelegate const& InDynDelegate);
FTimerHandle SetTimerForNextTick(TFunction&& Callback);
这里就不举例子了,和SetTimer基本相同
SetTimer
来清空Timer并创建新TimerGamePlay 定时器
UE4随笔:Gameplay定时器