UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
TimerManager.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3/*=============================================================================
4 TimerManager.h: Global gameplay timer facility
5=============================================================================*/
6
7#pragma once
8
9#include "CoreMinimal.h"
10#include "Stats/Stats.h"
11#include "UObject/Object.h"
12#include "Engine/TimerHandle.h"
13#include "Misc/TVariant.h"
14#include "Templates/Function.h"
15
16class UGameInstance;
17enum class ELevelCollectionType : uint8;
18struct FTimerSourceList;
19
20// using "not checked" user policy (means race detection is disabled) because this delegate is stored in a TSparseArray and causes its reallocation
21// from inside delegate's execution. This is incompatible with race detection that needs to access the delegate instance after its execution
25
26#ifndef UE_ENABLE_TRACKING_TIMER_SOURCES
27#define UE_ENABLE_TRACKING_TIMER_SOURCES !UE_BUILD_SHIPPING
28#endif
29
62
63enum class ETimerStatus : uint8
64{
65 Pending,
66 Active,
67 Paused,
70};
71
118
123{
124 bool bLoop = false;
125 bool bMaxOncePerFrame = false;
126 float FirstDelay = -1.f;
127};
128
133{
134public:
135
136 ENGINE_API void Tick(float DeltaTime);
138
139 // ----------------------------------
140 // Timer API
141
142 ENGINE_API explicit FTimerManager(UGameInstance* GameInstance = nullptr);
143 ENGINE_API virtual ~FTimerManager();
144
148 ENGINE_API virtual void OnCrash();
149
161 template< class UserClass >
162 inline void SetTimer(FTimerHandle& InOutHandle, UserClass* InObj, typename FTimerDelegate::TMethodPtr< UserClass > InTimerMethod, float InRate, bool InbLoop = false, float InFirstDelay = -1.f)
163 {
164 InternalSetTimer(InOutHandle, FTimerUnifiedDelegate( FTimerDelegate::CreateUObject(InObj, InTimerMethod) ), InRate, InbLoop, InFirstDelay);
165 }
166 template< class UserClass >
167 inline void SetTimer(FTimerHandle& InOutHandle, UserClass* InObj, typename FTimerDelegate::TConstMethodPtr< UserClass > InTimerMethod, float InRate, bool InbLoop = false, float InFirstDelay = -1.f)
168 {
169 InternalSetTimer(InOutHandle, FTimerUnifiedDelegate( FTimerDelegate::CreateUObject(InObj, InTimerMethod) ), InRate, InbLoop, InFirstDelay);
170 }
171
173 inline void SetTimer(FTimerHandle& InOutHandle, FTimerDelegate const& InDelegate, float InRate, bool InbLoop, float InFirstDelay = -1.f)
174 {
176 }
178 inline void SetTimer(FTimerHandle& InOutHandle, FTimerDynamicDelegate const& InDynDelegate, float InRate, bool InbLoop, float InFirstDelay = -1.f)
179 {
181 }
182 /*** Version that doesn't take a delegate */
183 inline void SetTimer(FTimerHandle& InOutHandle, float InRate, bool InbLoop, float InFirstDelay = -1.f)
184 {
185 InternalSetTimer(InOutHandle, FTimerUnifiedDelegate(), InRate, InbLoop, InFirstDelay);
186 }
188 inline void SetTimer(FTimerHandle& InOutHandle, TFunction<void(void)>&& Callback, float InRate, bool InbLoop, float InFirstDelay = -1.f )
189 {
190 InternalSetTimer(InOutHandle, FTimerUnifiedDelegate(MoveTemp(Callback)), InRate, InbLoop, InFirstDelay);
191 }
192
193 /* Preferred versions of the above methods that now take a more configurable structure that specifies timer looping and delay behavior. */
194
205 template <class UserClass>
206 inline void SetTimer(FTimerHandle& InOutHandle, UserClass* InObj, typename FTimerDelegate::TMethodPtr<UserClass> InTimerMethod, float InRate, const FTimerManagerTimerParameters& InTimerParameters)
207 {
208 InternalSetTimer(InOutHandle, FTimerUnifiedDelegate(FTimerDelegate::CreateUObject(InObj, InTimerMethod)), InRate, InTimerParameters);
209 }
210 template< class UserClass >
211 inline void SetTimer(FTimerHandle& InOutHandle, UserClass* InObj, typename FTimerDelegate::TConstMethodPtr<UserClass> InTimerMethod, float InRate, const FTimerManagerTimerParameters& InTimerParameters)
212 {
213 InternalSetTimer(InOutHandle, FTimerUnifiedDelegate(FTimerDelegate::CreateUObject(InObj, InTimerMethod)), InRate, InTimerParameters);
214 }
215
226 /*** Version that doesn't take a delegate */
228 {
229 InternalSetTimer(InOutHandle, FTimerUnifiedDelegate(), InRate, InTimerParameters);
230 }
232 inline void SetTimer(FTimerHandle& InOutHandle, TFunction<void(void)>&& Callback, float InRate, const FTimerManagerTimerParameters& InTimerParameters)
233 {
234 InternalSetTimer(InOutHandle, FTimerUnifiedDelegate(MoveTemp(Callback)), InRate, InTimerParameters);
235 }
236
243 template< class UserClass >
244 inline FTimerHandle SetTimerForNextTick(UserClass* inObj, typename FTimerDelegate::TMethodPtr< UserClass > inTimerMethod)
245 {
246 return InternalSetTimerForNextTick(FTimerUnifiedDelegate(FTimerDelegate::CreateUObject(inObj, inTimerMethod)));
247 }
248 template< class UserClass >
249 inline FTimerHandle SetTimerForNextTick(UserClass* inObj, typename FTimerDelegate::TConstMethodPtr< UserClass > inTimerMethod)
250 {
251 return InternalSetTimerForNextTick(FTimerUnifiedDelegate(FTimerDelegate::CreateUObject(inObj, inTimerMethod)));
252 }
253
256 {
257 return InternalSetTimerForNextTick(FTimerUnifiedDelegate(InDelegate));
258 }
261 {
262 return InternalSetTimerForNextTick(FTimerUnifiedDelegate(InDynDelegate));
263 }
265 inline FTimerHandle SetTimerForNextTick(TFunction<void(void)>&& Callback)
266 {
267 return InternalSetTimerForNextTick(FTimerUnifiedDelegate(MoveTemp(Callback)));
268 }
269
277 {
278 if (const FTimerData* TimerData = FindTimer(InHandle))
279 {
280 InternalClearTimer(InHandle);
281 }
282 InHandle.Invalidate();
283 }
284
286 inline void ClearAllTimersForObject(void const* Object)
287 {
288 if (Object)
289 {
290 InternalClearAllTimers( Object );
291 }
292 }
293
300
307
315 {
316 FTimerData const* const TimerData = FindTimer(InHandle);
317 return InternalGetTimerRate(TimerData);
318 }
319
327 {
328 FTimerData const* const TimerData = FindTimer( InHandle );
329 return TimerData && TimerData->Status != ETimerStatus::Paused;
330 }
331
339 {
340 FTimerData const* const TimerData = FindTimer(InHandle);
341 return TimerData && TimerData->Status == ETimerStatus::Paused;
342 }
343
351 {
352 FTimerData const* const TimerData = FindTimer(InHandle);
353 return TimerData && TimerData->Status == ETimerStatus::Pending;
354 }
355
363 {
364 return FindTimer(InHandle) != nullptr;
365 }
366
374 {
375 FTimerData const* const TimerData = FindTimer(InHandle);
376 return InternalGetTimerElapsed(TimerData);
377 }
378
386 {
387 FTimerData const* const TimerData = FindTimer(InHandle);
388 return InternalGetTimerRemaining(TimerData);
389 }
390
391 bool inline HasBeenTickedThisFrame() const
392 {
393 return (LastTickedFrame == GFrameCounter);
394 }
395
405
407 ENGINE_API void ListTimers() const;
408
409private:
410 ENGINE_API void SetGameInstance(UGameInstance* InGameInstance);
411
412// This should be private, but needs to be public for testing.
413public:
416
417// These should be private, but need to be protected so IMPLEMENT_GET_PROTECTED_FUNC works for testing.
418protected:
420 inline FTimerData const* FindTimer(FTimerHandle const& InHandle) const
421 {
422 return const_cast<FTimerManager*>(this)->FindTimer(InHandle);
423 }
425
426private:
427 ENGINE_API void InternalSetTimer( FTimerHandle& InOutHandle, FTimerUnifiedDelegate&& InDelegate, float InRate, bool bInLoop, float InFirstDelay );
429 ENGINE_API FTimerHandle InternalSetTimerForNextTick( FTimerUnifiedDelegate&& InDelegate );
430 ENGINE_API void InternalClearTimer( FTimerHandle InDelegate );
431 ENGINE_API void InternalClearAllTimers( void const* Object );
432 ENGINE_API float InternalGetTimerRate( FTimerData const* const TimerData ) const;
433 ENGINE_API float InternalGetTimerElapsed( FTimerData const* const TimerData ) const;
434 ENGINE_API float InternalGetTimerRemaining( FTimerData const* const TimerData ) const;
435
437 inline const FTimerData& GetTimer(const FTimerHandle& InHandle) const
438 {
439 return const_cast<FTimerManager*>(this)->GetTimer(InHandle);
440 }
441 ENGINE_API FTimerData& GetTimer(FTimerHandle const& InHandle);
442
444 ENGINE_API FTimerHandle AddTimer(FTimerData&& TimerData);
446 ENGINE_API void RemoveTimer(FTimerHandle Handle);
447 ENGINE_API bool WillRemoveTimerAssert(FTimerHandle Handle) const;
448
452 TArray<FTimerHandle> ActiveTimerHeap;
454 TSet<FTimerHandle> PausedTimerSet;
456 TSet<FTimerHandle> PendingTimerSet;
459
461 double InternalTime;
462
464 FTimerHandle CurrentlyExecutingTimer;
465
467 uint64 LastTickedFrame;
468
470 static ENGINE_API uint64 LastAssignedSerialNumber;
471
473 UGameInstance* OwningGameInstance;
474
475#if UE_ENABLE_TRACKING_TIMER_SOURCES
477 TUniquePtr<FTimerSourceList> TimerSourceList;
478#endif
479};
480
OODEFFUNC typedef void(OODLE_CALLBACK t_fp_OodleCore_Plugin_Free)(void *ptr)
uint64 GFrameCounter
Definition CoreGlobals.cpp:418
FPlatformTypes::TYPE_OF_NULLPTR TYPE_OF_NULLPTR
The type of the C++ nullptr keyword.
Definition Platform.h:1157
FPlatformTypes::int32 int32
A 32-bit signed integer.
Definition Platform.h:1125
FPlatformTypes::uint64 uint64
A 64-bit unsigned integer.
Definition Platform.h:1117
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
ELevelCollectionType
Definition EngineTypes.h:4240
ETimerStatus
Definition TimerManager.h:64
UE_INTRINSIC_CAST UE_REWRITE constexpr std::remove_reference_t< T > && MoveTemp(T &&Obj) noexcept
Definition UnrealTemplate.h:520
uint8_t uint8
Definition binka_ue_file_header.h:8
Definition UnrealTemplate.h:321
Definition TimerManager.h:133
ENGINE_API TStatId GetStatId() const
Definition TimerManager.cpp:1166
float GetTimerElapsed(FTimerHandle InHandle) const
Definition TimerManager.h:373
float GetTimerRate(FTimerHandle InHandle) const
Definition TimerManager.h:314
void SetTimer(FTimerHandle &InOutHandle, UserClass *InObj, typename FTimerDelegate::TMethodPtr< UserClass > InTimerMethod, float InRate, const FTimerManagerTimerParameters &InTimerParameters)
Definition TimerManager.h:206
void SetTimer(FTimerHandle &InOutHandle, FTimerDynamicDelegate const &InDynDelegate, float InRate, const FTimerManagerTimerParameters &InTimerParameters)
Definition TimerManager.h:222
void SetTimer(FTimerHandle &InOutHandle, float InRate, bool InbLoop, float InFirstDelay=-1.f)
Definition TimerManager.h:183
void ClearTimer(FTimerHandle &InHandle)
Definition TimerManager.h:276
void SetTimer(FTimerHandle &InOutHandle, float InRate, const FTimerManagerTimerParameters &InTimerParameters)
Definition TimerManager.h:227
ENGINE_API FTimerHandle GenerateHandle(int32 Index)
Definition TimerManager.cpp:1289
void SetTimer(FTimerHandle &InOutHandle, FTimerDelegate const &InDelegate, float InRate, bool InbLoop, float InFirstDelay=-1.f)
Definition TimerManager.h:173
FTimerData const * FindTimer(FTimerHandle const &InHandle) const
Definition TimerManager.h:420
void SetTimer(FTimerHandle &InOutHandle, FTimerDelegate const &InDelegate, float InRate, const FTimerManagerTimerParameters &InTimerParameters)
Definition TimerManager.h:217
void SetTimer(FTimerHandle &InOutHandle, TFunction< void(void)> &&Callback, float InRate, const FTimerManagerTimerParameters &InTimerParameters)
Definition TimerManager.h:232
virtual ENGINE_API ~FTimerManager()
Definition TimerManager.cpp:292
void ClearAllTimersForObject(void const *Object)
Definition TimerManager.h:286
ENGINE_API void PauseTimer(FTimerHandle InHandle)
Definition TimerManager.cpp:823
ENGINE_API FTimerHandle K2_FindDynamicTimerHandle(FTimerDynamicDelegate InDynamicDelegate) const
Definition TimerManager.cpp:566
void SetTimer(FTimerHandle &InOutHandle, FTimerDynamicDelegate const &InDynDelegate, float InRate, bool InbLoop, float InFirstDelay=-1.f)
Definition TimerManager.h:178
FTimerHandle SetTimerForNextTick(FTimerDelegate const &InDelegate)
Definition TimerManager.h:255
void SetTimer(FTimerHandle &InOutHandle, UserClass *InObj, typename FTimerDelegate::TConstMethodPtr< UserClass > InTimerMethod, float InRate, const FTimerManagerTimerParameters &InTimerParameters)
Definition TimerManager.h:211
float GetTimerRemaining(FTimerHandle InHandle) const
Definition TimerManager.h:385
ENGINE_API void UnPauseTimer(FTimerHandle InHandle)
Definition TimerManager.cpp:888
virtual ENGINE_API void OnCrash()
Definition TimerManager.cpp:300
FTimerHandle SetTimerForNextTick(FTimerDynamicDelegate const &InDynDelegate)
Definition TimerManager.h:260
void SetTimer(FTimerHandle &InOutHandle, UserClass *InObj, typename FTimerDelegate::TConstMethodPtr< UserClass > InTimerMethod, float InRate, bool InbLoop=false, float InFirstDelay=-1.f)
Definition TimerManager.h:167
void SetTimer(FTimerHandle &InOutHandle, UserClass *InObj, typename FTimerDelegate::TMethodPtr< UserClass > InTimerMethod, float InRate, bool InbLoop=false, float InFirstDelay=-1.f)
Definition TimerManager.h:162
bool IsTimerPaused(FTimerHandle InHandle) const
Definition TimerManager.h:338
bool IsTimerPending(FTimerHandle InHandle) const
Definition TimerManager.h:350
void SetTimer(FTimerHandle &InOutHandle, TFunction< void(void)> &&Callback, float InRate, bool InbLoop, float InFirstDelay=-1.f)
Definition TimerManager.h:188
bool IsTimerActive(FTimerHandle InHandle) const
Definition TimerManager.h:326
FTimerHandle SetTimerForNextTick(UserClass *inObj, typename FTimerDelegate::TConstMethodPtr< UserClass > inTimerMethod)
Definition TimerManager.h:249
bool TimerExists(FTimerHandle InHandle) const
Definition TimerManager.h:362
ENGINE_API void ListTimers() const
Definition TimerManager.cpp:1183
bool HasBeenTickedThisFrame() const
Definition TimerManager.h:391
FTimerHandle SetTimerForNextTick(TFunction< void(void)> &&Callback)
Definition TimerManager.h:265
FTimerHandle SetTimerForNextTick(UserClass *inObj, typename FTimerDelegate::TMethodPtr< UserClass > inTimerMethod)
Definition TimerManager.h:244
Definition Array.h:670
Definition UnrealString.h.inl:34
Definition SparseArray.h:524
Definition UniquePtr.h:107
void Set(typename TIdentity< U >::Type &&Value)
Definition TVariant.h:193
Definition GameInstance.h:152
U16 Index
Definition radfft.cpp:71
Definition DelegateBase.h:179
Definition TimerManager.h:73
uint8 bLoop
Definition TimerManager.h:75
FTimerData & operator=(FTimerData &&)=default
uint8 bMaxOncePerFrame
Definition TimerManager.h:80
ETimerStatus Status
Definition TimerManager.h:86
FTimerHandle Handle
Definition TimerManager.h:105
FTimerData(FTimerData &&)=default
double ExpireTime
Definition TimerManager.h:99
ENGINE_API FTimerData()
Definition TimerManager.cpp:917
float Rate
Definition TimerManager.h:92
ELevelCollectionType LevelCollection
Definition TimerManager.h:89
uint8 bRequiresDelegate
Definition TimerManager.h:83
const void * TimerIndicesByObjectKey
Definition TimerManager.h:108
FTimerData & operator=(const FTimerData &)=delete
FTimerUnifiedDelegate TimerDelegate
Definition TimerManager.h:102
FTimerData(const FTimerData &)=delete
Definition TimerHandle.h:12
Definition TimerManager.h:123
float FirstDelay
Definition TimerManager.h:126
bool bMaxOncePerFrame
Definition TimerManager.h:125
bool bLoop
Definition TimerManager.h:124
Definition TimerManager.h:32
FTimerUnifiedDelegate & operator=(FTimerUnifiedDelegate &&)=default
FTimerUnifiedDelegate(FTimerDynamicDelegate const &D)
Definition TimerManager.h:39
FTimerUnifiedDelegate(FTimerUnifiedDelegate &&)=default
FTimerUnifiedDelegate & operator=(const FTimerUnifiedDelegate &)=delete
FTimerUnifiedDelegate(FTimerDelegate const &D)
Definition TimerManager.h:38
const void * GetBoundObject() const
Definition TimerManager.cpp:409
FTimerUnifiedDelegate(const FTimerUnifiedDelegate &)=delete
FTimerUnifiedDelegate()
Definition TimerManager.h:36
bool IsBound() const
Definition TimerManager.cpp:394
FTimerDelegateVariant VariantDelegate
Definition TimerManager.h:34
FString ToString() const
Definition TimerManager.cpp:437
FTimerUnifiedDelegate(FTimerFunction &&Callback)
Definition TimerManager.h:40
void Unbind()
Definition TimerManager.h:48
void Execute() const
Definition TimerManager.cpp:339
Definition TVariant.h:13
Definition LightweightStats.h:416