이 카테고리는 고도 엔진(Godot Engine) 관련 문법을 기록하고 저장하기 위해 만든 공간입니다.
이번에는 게임 개발을 하다 보면 "3초 뒤에 몬스터를 소환해라", "1초마다 플레이어의 체력을 회복시켜라", "스킬을 한 번 쓰면 5초 동안 쿨타임을 적용해라" 같이 시간에 따라 무언가를 제어해야 하는 상황이 정말 많이 발생합니다. 고도 엔진에서는 이를 위해 Timer 노드를 사용하거나, 코드로 직접 타이머를 생성하는 두 가지 방법을 제공합니다.
1. Timer 노드 활용하기: 에디터에서 직관적으로 관리하기
가장 시각적이고 직관적인 방법은 씬(Scene) 구조에 Timer 노드를 직접 추가하는 것입니다.
- 주요 속성(Inspector 창):
- Wait Time: 타이머가 작동할 시간(초 단위)입니다. (예: 2.0 = 2초)
- One Shot: 이 옵션이 켜져 있으면(true) 시간이 다 된 후 한 번만 작동하고 멈춥니다. 꺼져 있으면(false) 무한히 반복됩니다.
- Autostart: 이 옵션이 켜져 있으면 게임이 시작되자마자 타이머가 자동으로 굴러갑니다.
- 시그널(Signal) 연결:
- 타이머의 시간이 모두 흐르면 timeout이라는 시그널이 발생합니다. 이 시그널을 스크립트에 연결하여 원하는 코드를 실행합니다.
@onready var my_timer = $Timer
func _ready():
# Autostart를 켜지 않았다면, 코드로 타이머를 시작할 수 있습니다.
my_timer.start()
# Timer 노드의 timeout 시그널과 연결된 함수입니다.
func _on_timer_timeout():
print("시간이 다 되었습니다! 몬스터를 소환합니다.")
# One Shot이 켜져 있다면, 필요할 때 다시 start()를 호출해 재사용할 수 있습니다.
2. 코드로 타이머 생성하기: 깔끔하고 유연하게 제어하기
씬 트리에 구구절절 노드를 추가하기 귀찮거나, 특정 상황에서만 잠깐 쓰고 버릴 타이머가 필요하다면 스크립트 안에서 즉석으로 타이머를 만들어 쓸 수 있습니다. 고도 엔진 4에서는 get_tree().create_timer()를 사용하면 단 한 줄로 이 작업을 수행할 수 있습니다.
이 방식은 특히 await 키워드와 결합했을 때 엄청난 시너지를 냅니다. 코드가 실행되다가 타이머가 끝날 때까지 그 자리에서 일시 정지(대기)하게 만들 수 있기 때문입니다.
func cast_spell():
print("마법 캐스팅 시작... (2초 소요)")
# 1. 2초짜리 일회성 타이머를 생성하고, timeout 시그널이 올 때까지 코드 실행을 '대기'합니다.
await get_tree().create_timer(2.0).timeout
print("마법 발사!!")
func hit_effect():
# 2. 피격 시 캐릭터를 빨갛게 바꿨다가 0.1초 뒤에 원래대로 되돌리는 연출
modulate = Color.RED
await get_tree().create_timer(0.1).timeout
modulate = Color.WHITE
3. 고급 팁: 씬 트리(Scene Tree) 타이머 vs 일반 내장 타이머
get_tree().create_timer()로 만든 타이머는 게임 속 세상의 시간 흐름을 따릅니다. 만약 게임을 일시 정지(get_tree().paused = true)시키면 이 타이머도 함께 멈춥니다.
만약 일시 정지 화면(메뉴 창 등)에서 게임 시간과 상관없이 독립적으로 작동하는 타이머를 코드로 만들고 싶다면, 아래와 같이 직접 Timer 객체를 생성해서 자식으로 등록해 주어야 합니다.
func create_custom_timer():
# 메모리상에 타이머 객체를 만듭니다.
var custom_timer = Timer.new()
custom_timer.wait_time = 3.0
custom_timer.one_shot = true
# 일시 정지 상태에서도 이 타이머는 무시하고 계속 흘러가도록 설정합니다.
custom_timer.process_mode = Node.PROCESS_MODE_ALWAYS
# 씬 트리에 추가하고 시그널을 코드로 연결합니다.
add_child(custom_timer)
custom_timer.timeout.connect(func(): print("일시정지 중에도 작동하는 타이머 완료!"))
custom_timer.start()
한눈에 보는 시간 제어 핵심 요약
| 방식 | 기능 설명 | 실전 타이머 제어 활용 예시 |
| Timer 노드 (에디터) | 씬 구조에 노드를 배치하고 timeout 시그널을 연결해 반복 동작을 수행합니다. | 주기적으로 총알을 쏘는 포탑, 1초마다 독 데미지를 입히는 장판 |
| await ... create_timer(초).timeout | 코드로 즉석 일회성 타이머를 생성하고, 시간이 다 될 때까지 코드를 일시 중단합니다. | 스킬 시전 대기 시간(딜레이), 콤보 공격 유효 시간 계산, 피격 반짝임 연출 |
| Timer.Wait Time | 타이머가 만료되기까지 걸리는 시간 설정 속성입니다. | 쿨타임을 5초에서 대장장이 강화 후 4초로 줄이는 로직 구현 등 |
| Timer.One Shot | 타이머의 반복 여부를 결정합니다. (true=1회성, false=무한 반복) | true: 대시(Dash) 지속시간 제어 / false: 초당 골드 자동 획득 시스템 |
'게임 > 고도엔진 문법' 카테고리의 다른 글
| 25. [고도 엔진] 부드러운 움직임의 비밀: 트윈(Tween) 시스템 완벽 가이드 (0) | 2026.07.13 |
|---|---|
| 23. [고도 엔진] 예측 불가능한 재미: 난수 생성기(randi, randf) 활용법 (0) | 2026.07.11 |
| 22. [고도 엔진] 게임 도중 총알 발사하기: 코드로 씬(Scene) 생성(instantiate) (0) | 2026.07.10 |