World가 가진 TimerManager에 타이머를 등록하는 구조다.

핵심은 세 단계로 나뉜다.

  • GetWorld()
  • GetTimerManager()
  • SetTimer()

이 표현은 한 번에 외우기보다, 각 단계가 무엇을 돌려주는지 분리해서 보는 편이 이해가 빠르다.

GetWorld

GetWorld()는 현재 객체가 속한 UWorld를 가져오는 호출이다.
Unreal의 많은 런타임 시스템은 world 단위로 관리되는데, 타이머도 그중 하나다.

그래서 타이머를 건다는 것은 단순히 객체 안에 지연 호출을 저장하는 것이 아니라, 현재 world가 가진 시간 관리 시스템에 작업을 등록하는 것에 가깝다.

GetTimerManager

GetTimerManager()는 해당 world가 가진 FTimerManager를 반환한다.
공식 API 설명도 그대로 Returns TimerManager instance for this world다.

이 부분이 중요한 이유는, timer가 독립적인 전역 함수처럼 동작하는 것이 아니라 현재 world의 수명과 tick 흐름 안에서 관리되기 때문이다.
같은 SetTimer라도 어떤 world에서 호출했는지가 전제 조건이 된다.

SetTimer

SetTimer()는 실제로 타이머를 등록하는 함수다.
공식 API 설명은 Sets a timer to call the given native function at a set interval이다.

의미를 풀어 보면 다음과 같다.

  • 어떤 함수를 호출할지 정한다.
  • 몇 초 뒤 또는 몇 초 간격으로 호출할지 정한다.
  • 반복 여부와 첫 시작 지연 같은 추가 옵션을 정한다.
  • 이후 제어를 위해 handle과 연결한다.

이 함수는 현재 실행을 멈추는 sleep 계열 함수가 아니라, 나중에 실행할 작업을 TimerManager에 예약하는 함수다.

Handle

Unreal 타이머는 보통 FTimerHandle과 함께 다룬다.
이 handle은 등록된 타이머를 식별하는 키에 가깝다.

handle이 있으면 이후에 같은 타이머를 대상으로 다음 작업을 할 수 있다.

  • 취소
  • 일시정지
  • 재개
  • 활성 상태 확인
  • 남은 시간 확인
  • 현재 실행 간격 확인

공식 API 문서 기준으로 기존 handle이 이미 타이머를 가리키고 있으면, SetTimer는 그 타이머를 먼저 clear하고 새 타이머로 교체한다.
그래서 handle은 단순한 출력값이 아니라, 타이머 생명주기를 관리하는 중심 키다.

SetTimer가 받는 정보

오버로드는 여러 개 있지만, 실제로 이해해야 할 입력은 크게 같다.

  • 어떤 handle에 연결할지
  • 어떤 object의 어떤 함수를 호출할지
  • 실행 간격이 얼마인지
  • 반복할지 여부
  • 첫 시작 지연이 필요한지

이 다섯 가지를 읽을 수 있으면 대부분의 SetTimer 호출 의도는 해석할 수 있다.

또 하나 중요한 규칙은 Rate <= 0일 때다.
공식 문서와 Gameplay Timers 문서 모두, 이 경우 새 타이머를 만드는 것이 아니라 기존 타이머를 clear하는 쪽으로 본다고 설명한다.

한 번 실행과 반복 실행

SetTimer는 크게 두 가지 패턴으로 나뉜다.

  • 한 번만 실행하는 타이머
  • 일정 간격으로 반복 실행하는 타이머

한 번만 실행하는 타이머는 "몇 초 뒤에 한 번 호출"이 목적일 때 쓴다.
반복 타이머는 "주기적으로 상태를 갱신"하거나 "쿨다운, 회복, 체크 로직을 일정 간격으로 돌릴 때" 자주 사용한다.

여기서 중요한 점은 반복 타이머가 while loop처럼 즉시 연속 실행되는 구조가 아니라는 것이다.
반복 타이머는 world의 시간 흐름을 따라, 정해진 시점마다 다시 호출된다.

First Delay

Gameplay Timers 문서를 보면 timer는 반복 간격과 별도로 첫 시작 지연을 둘 수 있다.
이 값은 특히 반복 타이머에서 의미가 크다.

예를 들어 interval은 1초지만, 첫 실행은 3초 뒤부터 시작하게 만들 수 있다.
그래서 timer를 읽을 때는 다음 두 값을 분리해서 보는 편이 정확하다.

  • 반복 간격
  • 첫 시작까지의 지연

이 둘을 섞어서 이해하면 "왜 바로 실행되지 않지?" 같은 해석 오류가 생기기 쉽다.

TimerManager에서 같이 보는 함수

Gameplay Timers 문서 기준으로 TimerManager는 등록만 하는 시스템이 아니다.
타이머 제어와 상태 조회 함수도 함께 제공한다.

대표적으로 같이 보는 함수는 다음과 같다.

  • ClearTimer
  • PauseTimer
  • UnPauseTimer
  • IsTimerActive
  • GetTimerRate

SetTimer는 시작점이고, 실제 사용은 handle을 통해 타이머 상태를 제어하는 흐름까지 포함해서 봐야 한다.

자주 생기는 오해

이 문법을 처음 보면 "객체가 혼자 시간을 세다가 나중에 함수를 부른다"처럼 이해하기 쉽다.
실제로는 object가 시간을 직접 세는 것이 아니라, world의 FTimerManager가 등록된 타이머를 관리한다.

또 다른 오해는 SetTimer를 단순 지연 호출 함수처럼만 보는 것이다.
실제로는 지연 실행, 반복 실행, 상태 조회, 일시정지와 재개까지 포함하는 예약 시스템에 더 가깝다.

언제 쓰는가

GetWorld()->GetTimerManager().SetTimer는 Tick에 계속 둘 필요는 없지만, 특정 시점이나 일정 간격으로 처리해야 하는 작업에 잘 맞는다.

예를 들면 다음과 같은 경우다.

  • 일정 시간 뒤 쿨다운 해제
  • 공격 지연 뒤 판정 활성화
  • 주기적인 회복 또는 데미지
  • 일정 간격의 상태 체크
  • 지연 종료가 필요한 UI나 이펙트

이런 작업을 Tick 안에 전부 넣는 것보다, timer로 의도를 분리하는 편이 코드 의미가 더 분명해진다.

'TIL' 카테고리의 다른 글

5/12 팀 작업 준비의 준비 프로젝트  (0) 2026.05.12
5/11 게임잼  (0) 2026.05.11
FPS Project 1  (0) 2026.05.06
Rendering : Forward, Deferred  (0) 2026.05.04
TEXT RPG 2  (0) 2026.04.29