跳到主要内容

01 - 定时器

本文主要说明了UE5中有关定时器的概念和基本用法。

定时器

定时器可用于执行延时操作或重复操作,例如让玩家每秒受到一次伤害,技能冷却CD等。定时器可以与标准的C++函数指针,TFunction对象或委托一起使用。

定时器受定时器管理器FTimerManager管理,其中全局的定时器管理器存在于游戏实例对象上以及每个场景中。可通过AActor::GetWorldTimeManager()访问定时器管理器FTimerManager,它会在当前UWorld中调用GetTimerManager函数;如果想访问全局的定时器管理器,需要使用UGameInstance::GetTimerManager()访问。

设置和清空定时器

必须通过FTimerManager来设置和清空定时器,其中:

  • FTimerManager::SetTimer():将定时器设置为在一段时间后调用函数或委托,并且可设置为无限重复调用,需要定时器句柄FTimerHandle作为首个参数;
  • FTimerManager::SetTimerForNextTick():将定时器设置在下一帧运行,而不是按固定间隔,不需要FTimerHandle作为参数;
  • FTimerManager::ClearTimer():取消定时器,需要FTimerHandle作为参数。此外,SetTimer()中的调用速率为负也能取消该定时器;
  • FTimerManager::ClearAllTimersForObject():取消与特定对象关联的所有定时器。

有关设置定时器的操作需要在AActor::BeginPlay()中设定,例如:

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现在可以复用于其他任意定时器。
}
// 在此进行一些操作...
}

暂停和恢复定时器

FTimerManager也支持暂停和恢复定时器:

  • FTimerManager::PauseTimer():使用定时器句柄来暂停正在运行的定时器;
  • FTimerManager::UnPauseTimer():使暂停的定时器恢复运行;

获取定时器信息

除了管理定时器,FTimerManager还支持获取特定定时器信息的函数,例如:

  • FTimerManager::IsTimerActive():获取指定定时器当前是否活跃且未暂停;
  • FTimerManager::GetTimerRate():获取指定定时器的速率(两次激活间的时间),如果FTimerHandle无效就返回-1;
  • FTimerManager::GetTimerElapsed():获取定时器的经过时间;
  • FTimerManager::GetTimerRemaining():获取定时器的剩余时间;

定时器的经过时间和剩余时间之和应该等于定时器的速率。

参考资料