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()
:获取定时器的剩余时间;
定时器的经过时间和剩余时间之和应该等于定时器的速率。