2024
11.13

언리얼 타이머?

일정 시간마다 반복되는 함수를 지정하기 위해

유니티에서는 InvokeRepeat 혹은 Task에 While을 넣는 방법, DoTween을 사용하는 방법 등을 활용했었다.

 

언리얼에서는 자체 내장된 FTimerHandleFTimerManager 클래스가 준비되어 있으니 이를 사용하면 된다.

 

언리얼 타이머 호출하기

우선 FTimerManager는 월드에 싱글톤으로 만들어져 있으니 Get으로 바로 가져올 수 있다.

GetWorld()->GetTimerManager()

 

가져온 매니저에 SetTimer 함수를 호출하면 되는데, 인자는 다음과 같다.

 

호출할 함수 포인터는 매개변수가 없는 void형 함수여야 한다.

FirstDelay는 실수하기 쉬운데, 기본값이 -1.0f이며, 기본값인 경우 자동으로 Rate의 값이 사용된다.

void SetTimer(
    FTimerHandle& OutHandle,        // 타이머 핸들
    UObject* Object,                // 함수를 실행할 객체
    FunctionPtr InTimerMethod,      // 호출할 함수
    float Rate,                     // 호출 간격 (초 단위)
    bool bLoop = false,             // 반복 여부
    float FirstDelay = -1.0f        // 초기 지연 시간 (옵션)
);

 

실제 사용코드는 다음과 같다.

// 타이머를 2초마다 반복 호출하도록 설정
FTimerHandle TimerHandle;
GetWorld()->GetTimerManager().SetTimer(
    TimerHandle, this, &AMyActor::MyTimerFunction, 2.0f, true
);

 

FTimerDelegate::CreateLambda 를 사용하여 람다를 호출하는 것도 가능하다.

FTimerHandle Handle;
GetWorld()->GetTimerManager().SetTimer(Handle, FTimerDelegate::CreateLambda([&]
    {
        // 함수의 내용
    }
), 1.0f, true, 0.0f);

 

FTimerHandle을 사용한 타이머의 추가 조작

타이머 호출 시 넘겨준 FTimerHandle을 사용하여 타이머를 추가 조작할 수 도 있다.

GetWorld()->GetTimerManager().ClearTimer(TimerHandle); // 중지
GetWorld()->GetTimerManager().PauseTimer(TimerHandle); // 일시정지
GetWorld()->GetTimerManager().UnPauseTimer(TimerHandle); // 다시 시작

 

타이머의 상태 확인

동일하게 타이머 호출시 넘겨준 FTimerHandle로 타이머의 상태를 확인하는 것도 가능하다.

// IsTimerActive: 타이머가 활성 상태인지 확인
bool bIsActive = GetWorld()->GetTimerManager().IsTimerActive(TimerHandle);

// IsTimerPaused: 타이머가 일시 정지 상태인지 확인
bool bIsPaused = GetWorld()->GetTimerManager().IsTimerPaused(TimerHandle);

// GetTimerRemaining: 타이머가 다음 호출까지 남은 시간을 반환
float TimeRemaining = GetWorld()->GetTimerManager().GetTimerRemaining(TimerHandle);