게임/고도엔진 문법

24. [고도 엔진] 시간에 따른 동작 제어: Timer 노드와 코드 타이머 생성

밀감감 2026. 7. 11. 13:17
반응형

 

이 카테고리는 고도 엔진(Godot Engine) 관련 문법을 기록하고 저장하기 위해 만든 공간입니다.

 

이번에는 게임 개발을 하다 보면 "3초 뒤에 몬스터를 소환해라", "1초마다 플레이어의 체력을 회복시켜라", "스킬을 한 번 쓰면 5초 동안 쿨타임을 적용해라" 같이 시간에 따라 무언가를 제어해야 하는 상황이 정말 많이 발생합니다. 고도 엔진에서는 이를 위해 Timer 노드를 사용하거나, 코드로 직접 타이머를 생성하는 두 가지 방법을 제공합니다.

1. Timer 노드 활용하기: 에디터에서 직관적으로 관리하기

가장 시각적이고 직관적인 방법은 씬(Scene) 구조에 Timer 노드를 직접 추가하는 것입니다.

  • 주요 속성(Inspector 창):
    • Wait Time: 타이머가 작동할 시간(초 단위)입니다. (예: 2.0 = 2초)
    • One Shot: 이 옵션이 켜져 있으면(true) 시간이 다 된 후 한 번만 작동하고 멈춥니다. 꺼져 있으면(false) 무한히 반복됩니다.
    • Autostart: 이 옵션이 켜져 있으면 게임이 시작되자마자 타이머가 자동으로 굴러갑니다.
  • 시그널(Signal) 연결:
  • 타이머의 시간이 모두 흐르면 timeout이라는 시그널이 발생합니다. 이 시그널을 스크립트에 연결하여 원하는 코드를 실행합니다.
GDScript
 
@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 키워드와 결합했을 때 엄청난 시너지를 냅니다. 코드가 실행되다가 타이머가 끝날 때까지 그 자리에서 일시 정지(대기)하게 만들 수 있기 때문입니다.

GDScript
 
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 객체를 생성해서 자식으로 등록해 주어야 합니다.

GDScript
 
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: 초당 골드 자동 획득 시스템
반응형