UE4Gameplay定时器

发布时间 2023-11-07 22:41:33作者: XTG111

参考
定时器在全局定时器管理器(FTimerManager类)中管理,对于每个实例Uobject和场景都会有全局定时器管理器,一般来说通过SetTimer和SetTimerForNextTick来设置定时器。SetTimer具有loop属性。

访问使用定时器

AActor类对象:直接使用GetWorldTimerManager()函数,AActor::GetWorldTimerManager()相当于在UWorld中调用GetTimerManager()函数。
使用全局定时器管理器:UGameInstance::GameTimerManager(),全局管理器可以用于与任何特定场景的存在没有相关性或依赖性的函数调用

设置和清空定时器

FTimerManager类中的SetTimer函数可以将定时器设置为在一段时间后调用函数或委托,也可以设置对函数的Loop。需要注意的是在这些被调用的函数或者委托的定义中需要添加定时器句柄(FTimerHandle类)需要在头文件声明。定时器句柄主要用于暂停(或恢复)倒计时,查询或更改剩余时间,以及取消定时器。
还可以通过直接设置定时器在下一帧运行:SetTimerForNextTick,该方法不需要使用定时器句柄。
清空定时器的方法:将FTimerHandle类变量传入FTimerManager函数的ClearTimer中,使得句柄对该定时器失效,并且可以使用其去管理其他定时器。清空操作需要在被调用函数或者委托中进行。
如果想清空与特定对象关联的所有定时器可以通过ClearAllTimersForObject方法。
以小于等于0的速率调用SetTimer等效于调用ClearTimer

//.h
FTimerHandle MemberTimerHandle;

//.cpp
void AMyActor::BeginPlay()
{
    Super::BeginPlay();
    // 从现在开始两秒后,每秒调用一次RepeatingFunction。
    GetWorldTimerManager().SetTimer(MemberTimerHandle, this, &AMyActor::RepeatingFunction, 1.0f, true, 2.0f);
}

void AMyActor::RepeatingFunction()
{
    // 调用该函数达到足够次数后,清空定时器。
    if (--RepeatingCallsRemaining <= 0)
    {
        GetWorldTimerManager().ClearTimer(MemberTimerHandle);
        // MemberTimerHandle现在可以复用于其他任意定时器。
    }
    // 在此进行一些操作...
}

暂停和恢复定时器

PauseTimer:定时器句柄来暂停正在运行的定时器。这样可阻止定时器执行其函数调用,但经过的时间和剩余时间将保持暂停时的状态
UnPauseTimer:将某个暂停的定时器恢复

定时器信息

FTimerManager类定时器管理器可以用于获取某个定时器的信息(速率,经过的时间和剩余时间)

  1. IsTimerActive:判断该定时器是否活跃且没有被暂停
  2. GetTimerRate:根据定时器句柄获取定时器的当前速率(两次激活时间间隔),如果句柄无效,返回-1
  3. GetTimerElapsed和GetTimerRemaing:同样需要一个定时器句柄,返回经过时间和剩余时间,如果句柄无效,返回-1
    定时器的经过时间和剩余时间之和应该等于定时器的速率