FTimerHandle은 언리얼 엔진에서 시간 기반 작업을 예약하고 관리하는 도구이다. 보통 특정 시간이 지난 후 함수를 실행하거나, 일정 간격으로 반복 실행할 때 사용된다. 동작은 FTimerManager를 통해 동작한다.
역할 | |
FTimerHandle | FTimerManager |
타이머 제어를 위한 핸들(참조값) 역할 | 모든 타이머를 관리하는 역할 |
시간 측정이 아닌 FTimerManager의 등록된 타이머를 가리킴 |
내부적 등록된 타이머들을 리스트에 저장, 프레임 단위로 재확인 |
FTimerHandle를 사용해 특정 타이머를 멈출 수 있음 | 시간이 지나면 함수를 실행, 반복 실행일 경우 재등록 |
FTimerHandle은 반드시 클래스 멤버 변수로 선언해야함
- 사용법
FTimerHandle MyTimerHandle;
void StartTimer()
{
GetWorld()->GetTimerManager().SetTimer(
MyTimerHandle, // 타이머 핸들
this, // 현재 객체 (AMyActor)
&AMyActor::MyFunction, // 실행할 함수
2.0f, // 2초 후 실행
false // 반복 실행 여부 (false: 한 번만 실행)
);
}
void MyFunction()
{
UE_LOG(LogTemp, Warning, TEXT("타이머 실행됨!"));
}
//StartTimer()를 호출하면 2초 후 MyFunction()이 실행되며 반복이 꺼져있어 한 번만 실행됨
//false를 true로 바꾸게 되면 2초마다 MyFunction()이 실행됨
//----------------------------------------------------------------
FTimerHandle RepeatTimerHandle;
void StopTimer()
{
GetWorld()->GetTimerManager().ClearTimer(RepeatTimerHandle);
}
void CheckTimer()
{
if (GetWorld()->GetTimerManager().IsTimerActive(RepeatTimerHandle))
{
UE_LOG(LogTemp, Warning, TEXT("타이머가 실행 중!"));
}
else
{
UE_LOG(LogTemp, Warning, TEXT("타이머가 멈춰 있음."));
}
}
//ClearTimer()를 사용하면 타이머를 멈추고 초기화 된다.
//IsTimerActive()로 타이머가 현재 작동중인지 확인 가능하다.
타이머를 멈출 필요가 없거나 한 번만 실행되는 타이머일 때는 FTimerHandle 없이 SetTimer()를 사용할 수 있다. 이렇게 코드를 짜게 되면 타이머를 관리 할 필요 없이 2초 후에 실행되고 자동으로 제거된다.
GetWorld()->GetTimerManager().SetTimer(
FTimerHandle(),
this,
&AMyActor::MyFunction,
2.0f,
false
);
주의할 점으로는 ClearTimer()를 하지 않으면 타이머가 계속 실행될 수 있으며 이 경우 크래시가 발생할 가능성이 있다.
void AMyActor::EndPlay(const EEndPlayReason::Type EndPlayReason)
{
GetWorld()->GetTimerManager().ClearTimer(RepeatTimerHandle);
}
EndPlay() 같은 함수에서 ClearTimer()를 호출하여 객체가 파괴될 때 타이머를 정리할 수 있다.
'언리얼 엔진 메모장' 카테고리의 다른 글
UE_LOG (0) | 2025.03.05 |
---|---|
TWeakObjectPtr (0) | 2025.03.04 |
UPROPERTY & UFUNCTION (0) | 2025.02.28 |