본문 바로가기

UE4

[UE4] FTimerManager::SetTimer/ClearTimer/GetTimerElapsed

0. 설명

 
아래 코드에서는 전반적인 타이머를 사용법을 보여주고 있다.
UWorld::GetTimerManager() 함수는 다음과 같다.
// Runtime/Engine/Classes/Engine/World.h

/** Gameplay timers. */
class FTimerManager* TimerManager;

inline FTimerManager& GetTimerManager() const
{
    // GameInstance가 있으면 GameInstance의 TimerManager를 반환하고,
    // 그렇지 않다면, 자신의 TimerManager를 돌려준다
    return (OwningGameInstance ? OwningGameInstance->GetTimerManager() : *TimerManager);
}
 
참고로, FTimerManager는 Runtime/Engine/Public/TimerManager.h에 선언되어 있다.
 

1. Code

///////////////////////////////////////////////////////////////////////////////////////////////
// Header
///////////////////////////////////////////////////////////////////////////////////////////////

// Declare TimerHandle
FTimerHandle ObjectCheckTimer;


///////////////////////////////////////////////////////////////////////////////////////////////
// Cpp
///////////////////////////////////////////////////////////////////////////////////////////////

if (UWorld* world = GetWorld())
{
    // UABGameInstance::CheckUObjectAlive 콜백 함수를
    // 최초 1회엔 5초 뒤에, 그 다음부턴 매 1초마다 수행되게 하는 타이머 등록
    world->GetTimerManager().SetTimer(
        ObjectCheckTimer,    // TimerHandle
        this,    // FTimerDelegate 델리게이트 수행 객체
        &UABGameInstance::CheckUObjectAlive,    // FTimerDelegate (TimerManager.h 확인)
        1.0f,    // Interval
        true,    // 반복 여부 (false : 1회만)
        5.0f    // 최초 Interval, 이것이 0이면 Interval이 사용됨
    );
}

void UABGameInstance::CheckUObjectAlive()
{
    if (UWorld* world = GetWorld())
    {
        // World의 TimerManager를 얻어
        FTimerManager& timerManager = world->GetTimerManager();
        // 이전 콜백과 지금 콜백간의 실제 간격 시간 구하기 (지정한 interval 대비 오차 추적시 사용)
        float lifetime = timerManager.GetTimerElapsed(ObjectCheckTimer);
        // 타이머 해제
        timerManager.ClearTimer(ObjectCheckTimer);
    }  
}