U++中的Timer定时器

📅 发布时间:2026/7/11 16:34:25 👁️ 浏览次数:
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中。