2026-04-28 TIL (46일차)
2026-04-28 TIL (46일차)
타이머 매니저(TimerManager)의 원리와 디버프 해제 로직
드론이 슬로우 디버프에 걸렸을 때, 시간이 다 되면 호출되는 해제 함수 코드를 보면 단순히 bIsSlowed = false;로 스위치만 끄고 있습니다.
1
2
3
4
void AWeek3Drone::ClearSlow()
{
bIsSlowed = false;
}
이 코드를 보면 “상태만 꺼졌지, 타이머의 시간은 계속 뒤에서 돌아가고 있는 게 아닐까?” 하는 합리적인 의심이 들 수 있습니다. 하지만 결론부터 말씀드리면 시간은 남아있지 않으며, 타이머도 이미 깔끔하게 사라진 상태입니다. 그 이유는 언리얼 엔진의 SetTimer 작동 방식 때문입니다.
SetTimer
디버프를 부여하는 ApplySlow 함수를 다시 살펴보겠습니다.
1
GetWorldTimerManager().SetTimer(SlowTimerHandle, this, &AWeek3Drone::ClearSlow, RemainingTime, false);
이 코드는 엔진에게 다음과 같이 명령하는 것과 같습니다.
“지금부터 딱 RemainingTime(예: 5초)이 흐른 뒤에, ClearSlow 함수를 딱 한 번(false)만 실행해 줘!”
- 타이머의 수명: 언리얼의 타이머는 설정된 시간이 0초가 되어 지정된 함수(ClearSlow)를 실행하는 순간, 자기 할 일을 다 하고 자연스럽게 소멸합니다.
- 즉, ClearSlow가 실행되었다는 것 자체가 이미 남은 시간이 0초가 되어 알람이 울렸다는 뜻입니다. 따라서 억지로 시간을 초기화하거나 타이머 객체를 직접 부술 필요가 없는 것입니다.
This post is licensed under CC BY 4.0 by the author.