KoreanFoodie's Study
SetTimer 에 함수 및 람다(Lambda) 연결하기 본문
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 델리게이트 분류
'Game Dev > Unreal C++ : Dev Log' 카테고리의 다른 글
[언리얼] TimerHandle 배열 사용하기 (TimerHandle Array) (0) | 2023.03.10 |
---|---|
[언리얼] 동적으로 액터 컴포턴트 생성하기 (Dynamically create ActorComponent) (0) | 2023.03.10 |
[언리얼] 현재 시간 로그 찍기 (0) | 2023.02.02 |
[언리얼] SafeZone 위젯 (0) | 2023.01.16 |
[언리얼] 효율적인 클래스 타입 체크 방법 (런타임) (0) | 2023.01.13 |
Comments