U++中的Timer定时器
本文主要用于记录UECpp笔记。
基础用法:
#pragma once #include "CoreMinimal.h" #include "GameFramework/Actor.h" #include "CppTest_1.generated.h" UCLASS() class NEW_CPP_API ACppTest_1 : public AActor { GENERATED_BODY() public: ACppTest_1(); protected: virtual void BeginPlay() override; public: virtual void Tick(float DeltaTime) override; void PrintAfterDelay(); };#include "CppTest_1.h" ACppTest_1::ACppTest_1() { PrimaryActorTick.bCanEverTick = true; } void ACppTest_1::BeginPlay() { Super::BeginPlay(); FTimerHandle TimerHandle; GetWorldTimerManager().SetTimer( TimerHandle, this, &ACppTest_1::PrintAfterDelay, 5.0f, false ); } void ACppTest_1::PrintAfterDelay() { if (GEngine) { GEngine->AddOnScreenDebugMessage( -1, 5.0f, FColor::Green, TEXT("5 seconds later") ); } } void ACppTest_1::Tick(float DeltaTime) { Super::Tick(DeltaTime); }GetWorldTimerManager().SetTimer(TimerHandle, this, &类名::函数名, 5.0f, false);
传入的timerhandle参数是一个引用;&类名::函数名字,是获取函数地址;布尔变量表示是否循环。
着重讲解一下TimerHandle。
在SetTimer之前需要先定义FTimerHandle TimerHandle,它是定时器的标识符(注:在UE中F开头表示结构体)。
不存在同一个timerhandle同时管理两个定时器,后一个定时器会去取代前一个定时器。如需要两个独立定时器,应使用两个句柄。
GetWorldTimerManager().SetTimer( TimerHandle, this, &ACppTest_1::FunctionA, 5.0f, false ); // 使用同一个句柄重新设置 GetWorldTimerManager().SetTimer( TimerHandle, this, &ACppTest_1::FunctionB, 2.0f, false );ClearTimer()停止并彻底清除,clear是将定时器从管理器中删除,如果要重新运行,需要再次调用TimerHandle。
PauseTimer()暂停定时器,如果运行四秒停止,即便游戏已经运行20妙,定时器记录的仍然是四秒,不会减少。
UnPauseTimer(),取消暂停,从剩余位置继续。
IsTimerActive(),判断是否正在运行(并非判断是否存在),返回bool值。
IsTimerPause(),判断是否暂停(clear后,输出false)。
TimerExists()判断是否存在于管理器中(clear后,输出false)。
//判断常见写法: if (GetWorldTimerManager().IsTimerActive(TimerHandle)) { UE_LOG(LogTemp, Warning, TEXT("定时器正在运行")); } else if (GetWorldTimerManager().IsTimerPaused(TimerHandle)) { UE_LOG(LogTemp, Warning, TEXT("定时器已暂停")); } else { UE_LOG(LogTemp, Warning, TEXT("定时器不存在")); }GetTimerRemaining():获取每一轮(循环定时器)的剩余时间。如果是一个十秒钟的计时器,已经过去三秒,则返回7.0f;定时器不存在则返回-1.0f。
// 停止并清除定时器 GetWorldTimerManager().ClearTimer(TimerHandle); // 暂停定时器 GetWorldTimerManager().PauseTimer(TimerHandle); // 恢复定时器 GetWorldTimerManager().UnPauseTimer(TimerHandle); // 判断定时器是否存在 GetWorldTimerManager().IsTimerActive(TimerHandle); // 获取剩余时间 GetWorldTimerManager().GetTimerRemaining(TimerHandle);写在最后:TimerHandle一般在头文件的private或protected中创建;定时器一般写在BeginPlay和合适的事件/成员函数中,一般不写在Tick中。
