UE에서 타이머를 구현하려면 TimerManager의 SetTimer()를 이용하면 된다.
SetTimer() 원형
template< class UserClass >
FORCEINLINE void SetTimer(FTimerHandle& InOutHandle, UserClass* InObj, typename FTimerDelegate::TMethodPtr<UserClass> InTimerMethod, float InRate, bool InbLoop = false, float InFirstDelay = -1.f)
{
InternalSetTimer(InOutHandle, FTimerUnifiedDelegate(FTimerDelegate::CreateUObject(InObj, InTimerMethod) ), InRate, InbLoop, InFirstDelay);
}
FORCEINLINE void SetTimer(FTimerHandle& InOutHandle, FTimerDelegate const& InDelegate, float InRate, bool InbLoop, float InFirstDelay = -1.f)
{
InternalSetTimer(InOutHandle, FTimerUnifiedDelegate(InDelegate), InRate, InbLoop, InFirstDelay);
}
자주 쓰이는 두 가지 형태다.
각각 함수와 델리게이트를 매개변수로 받아 호출한다.
함수를 호출
3초 뒤 Foo()를 호출하도록 해보자.
void ATimerActor::BeginPlay()
{
Super::BeginPlay();
FTimerHandle TimerHandle;
GetWorld()->GetTimerManager().SetTimer(TimerHandle, this, &ATimerActor::Foo, 3, false);
}
void ATimerActor::Foo()
{
// ...
}
이때 마지막 InFirstDelay 는 생략을 했는데,
InFirstDelay의 기본 값은 -1로, 0이상의 값을 넣은 경우 타이머 시작시간이 된다.
그럼 InFirstDelay를 이용해서 5초 뒤부터 Foo()를 1초간격으로 반복적으로 호출하도록 해보자.
void ATimerActor::BeginPlay()
{
Super::BeginPlay();
FTimerHandle TimerHandle;
GetWorld()->GetTimerManager().SetTimer(TimerHandle, this, &ATimerActor::Foo, 1, true, 5);
}
void ATimerActor::Foo()
{
// ...
}
이제 이 Timer친구는 ATimerActor Instance가 소멸할 때까지 우리와 영원히 함께할 것이다.
이번엔 조건을 만족하면 Timer가 종료되도록 해보자.
일단 FTimerHandle TimerHandle;을 헤더로 옮기자.
// TimerActor.h
FTimerHandle TimerHandle;
int32 TimerCount = 0;
// TimerActor.cpp
void ATimerActor::BeginPlay()
{
Super::BeginPlay();
GetWorld()->GetTimerManager().SetTimer(TimerHandle, this, &ATimerActor::Foo, 1, true, 5);
}
void ATimerActor::Foo()
{
TimerCount++;
if(TimerCount == 5)
{
GetWorld()->GetTimerManager().ClearTimer(TimerHandle);
}
}
자, 우린 이렇게 Timer를 5번만 호출하고 미국으로 보내버렸다.
델리게이트를 호출
void ATimerActor::BeginPlay()
{
Super::BeginPlay();
FTimerHandle TimerHandle;
FTimerDelegate TimerDelegate;
TimerDelegate.BindLambda(
[]()
{
// ...
});
GetWorld()->GetTimerManager().SetTimer(TimerHandle, TimerDelegate, 3, false);
}
FTimerDelegate를 이용하거나
void ATimerActor::BeginPlay()
{
Super::BeginPlay();
FTimerHandle TimerHandle;
GetWorld()->GetTimerManager().SetTimer(
TimerHandle,
[]()
{
// ...
},
3,
false);
}
람다 표현식을 이용해 바로 넣을 수도 있다.
'UE5' 카테고리의 다른 글
[UE5] CommonUI 생성 후 에러 (0) | 2024.04.08 |
---|---|
[UE5][UE4vstool] UE 매크로에 Indentation 끄기 (0) | 2023.08.12 |
[UE5][Error] fatal error C1083: 포함 파일을 열 수 없습니다. (0) | 2023.08.05 |