KoreanFoodie's Study

SetTimer 에 함수 및 람다(Lambda) 연결하기 본문

Game Dev/Unreal C++ : Dev Log

SetTimer 에 함수 및 람다(Lambda) 연결하기

GoldGiver 2023. 2. 20. 20:35

SetTimer 에 함수 및 람다(Lambda) 연결하기

핵심 :

1. UObject 상속 클래스에서는 기존 함수를 SetTimer 함수에서 바로 연결할 수 있다.
2. 일반적으로는 FTimerDelegate 에 Lamda 함수를 연결해 사용하며, UObject 를 상속하지 않는 클래스에서도 이 방법을 사용할 수 있다.
3. FTimerHandle 은 전역이며, 사용 완료 후에는 ClearTimer 를 이용해 타이머를 해제해 주도록 하자!

이전 글에서 언급한 바 있지만, 일정 시간 이후 특정 함수가 호출되도록 만드는 방법을 조금 더 자세히 기록해보려 한다.  SetTimer 에 함수와 람다를 연결하는 방법을 추가로 소개한다!

 

1. 기존 함수에 그대로 연결 (UObject 클래스에서 사용 가능)

FTimerHandle timerHandle;

GetWorld()->GetTimerManager().SetTimer(
	timerHandle,
    this,
    &UTestClass::UpdateSomething,
    1.0f,
    true
);

 

 

2. FTimerDelegate 만들기 (UObject 클래스 아니어도 사용 가능)

// 외부에서 UClass 를 통해 UWorld 를 받아 와야 한다
UWorld* world = SomeUClassObject->GetWorld();

if (world == nullptr)
{
    return;
}

FTimerDelegate timerCallback;
timerCallback.BindLambda([] {
    int randVal = FMath::RandRange(0, 1);
    if (randVal == 0)
    {
        JustDo();
    }
    else
    {
    	GiveUp();
    }
    });

FTimerHandle testTimeHandle;
world->GetTimerManager().SetTimer(testTimeHandle,
    timerCallback, 1.0f, false);

위 코드는 1.0 초 후, timerCallback 에 정의된 람다 함수를 호출하게 된다.

 

 

3. 번 : 람다 만들기 (UObject 클래스 아니어도 사용 가능)

// 타이머 해제. 타이머 시작 전에 해제가 필요한 경우 항상 해제하고 안전하게 사용하자.
ClearTimer(myTimerHandle);

inWorld->GetTimerManager().SetTimer(
	myTimerHandle,
	FTimerDelegate::CreateLambda([this]() {
		DoSomething();
	}), delayTime, false);

delayTime 이후 람다에 연결된 코드를 실행한다. FTimerDeleagate 변수를 따로 선언할 필요가 없어 2번보다 더 깔끔하다.

 

 

4. 번 : WeakLambda 만들기 (UObject 클래스 아니어도 사용 가능)

// 각 파티클마다 딜레이 타이머 설정하여 재생
for (FParticleInfo& pi : particleInfoArray)
{
    GetWorld()->GetTimerManager().SetTimer(
        pi.timer,
        FTimerDelegate::CreateWeakLambda(this, [&pi, this]() {
        PlayParticle(pi);
    }), pi._delayTime, false);
}

WeakLambda 는, 약한 참조가 있는 UObject 객체와 연결될 때 사용한다. 자세한 내용은 아래 스샷을 참고하자.

 

참고 : 언리얼 공식 문서, UE4 델리게이트 분류
Comments