게임 엔진/Unreal

[Unreal] [Example] 타이머 이용 방법 (Timer)

AlgorFati 2020. 12. 15. 20:55

익명 타이머

{
	FTimerHandle UnusedHandle;
	float Duration = 0.1f;
	bool bLoop = false;
    
	GetWorldTimerManager().SetTimer(
    	UnusedHandle, this, &ClassName::FunctionName, Duration, bLoop);
}

 

람다를 이용한 등록

{
    FTimerHandle TimerHandle;
    FTimerDelegate TimerCallback;
    TimerCallback.BindLambda( 
        [this, FaceId] 
        {
            // ..
        });
    World->GetTimerManager().SetTimer(TimerHandle, TimerCallback, 1.0f, false);
}

 

 

타이머 등록/제거

FTimerHandle은 타이머를 구별하는 id 정도로 생각해도 좋다.

// header
FTimerHandle TimerHandle;


// source
void TestActor::RegisterTimer()
{
	GetWorld()->GetTimerManager().SetTimer(
                TimerHandle, this, &TestActor::OnTimerTick, 0.016f, true);
}

void TestActor::RemoveTimer()
{
	GetWorld()->GetTimerManager().ClearTimer(TimerHandle);
}

 

Kismet 타이머

{
	float Duration = 1.0f
	bool bLoop = true;
	UKismetSystemLibrary::K2_SetTimer(this, FString(TEXT("FunctionName")), Duration, bLoop);
}

 

 

 

타이머의 붙은 객체에 파괴에 대한 걱정

다음과 같은 상황을 가정해보자.

한 Actor가 있고 이 액터는 GetWorld()->GetTimerManager()를 통해 SetTimer를 하였다.

그리고 중간에 Actor가 파괴된다면, 이 타이머는 어떻게 될까?

SetTimer시에 bLoop를 false로 한다면 Duration이 끝날 때 타이머는 TimerManager에서 해제된다.

그리고 bLoop에 관계없이 Actor가 파괴되면 TimerManager에서 해제된다.