定时器(Timer) 可用于执行延迟类型的操作,或让某些操作在一段时间内重复执行。
定时器的设置只需三步即可完成:声明定时器句柄 FTimerHandle、定义执行函数、设置定时器,其中前两步是第三步的预备工作。
首先是声明定时器句柄 FTimerHandle,代码实现如下:
#include "TimerManager.h"
UCLASS()
class DEMO_API AMyCharacter : public ACharacter, public IMyInterface
{
GENERATED_BODY()
public:
// Sets default values for this character's properties
AMyCharacter();
protected:
// Called when the game starts or when spawned
virtual void BeginPlay() override;
public:
// Called every frame
virtual void Tick(float DeltaTime) override;
// Called to bind functionality to input
virtual void SetupPlayerInputComponent(class UInputComponent *PlayerInputComponent) override;
//声明定时器变量
FTimerHandle TimerHandle;
void TimerFunction();
};
void AMyCharacter::TimerFunction()
{
UE_LOG(LogTemp, Warning, TEXT("TimerFunction"));
GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Red, TEXT("TimerFunction"));
}
注意:不可以在Actor的构造函数中设置定时器
// Called when the game starts or when spawned
void AMyCharacter::BeginPlay()
{
Super::BeginPlay();
// 设置定时器 5秒后执行TimerFunction函数,每5秒执行一次
GetWorldTimerManager().SetTimer(TimerHandle, this, &AMyCharacter::TimerFunction, 5.f, true);
}
SetTimer() 各个参数的作用如下:
编译之后,运行打印结果
设置定时器后,一定不要忘了清除定时器
。这就像申请了资源,一定要归还一样。取消定时器的话,建议直接使用ClearTimer(),其用法示例如下:
if (TimeHandle.IsValid())
{
GetWorldTimerManager().ClearTimer(TimerHandle);
}
清除定时器可在 Actor 的 EndPlay() 函数中执行,但在其他地方也是可以的,只是不要忘记清除定时器。