게임/고도엔진 문법

16. [고도 엔진] 노드 간 통신의 핵심! 시그널(Signal) 연결하고 발생시키기

밀감감 2026. 7. 4. 10:30
반응형

 

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

 

이번에는 고도 엔진에서 노드들이 서로 깔끔하게 소통할 수 있도록 돕는 시스템, '노드 간 통신 시그널(Signal) 연결하고 발생시키기'입니다.

게임 개발을 하다 보면 "적을 처치하면 UI의 점수가 올라가야 한다", "플레이어가 스위치를 밟으면 저 멀리 있는 문이 열려야 한다"처럼 노드끼리 이벤트를 주고받아야 하는 상황이 무수히 많습니다. 이때 노드들을 직접 참조하여 명령을 내리면 구조가 복잡해지고 꼬이기 쉽습니다. 고도 엔진은 이를 '시그널(신호)'이라는 방송 시스템을 통해 우아하게 해결합니다.

1. 커스텀 시그널 정의하고 발생시키기 (signal, emit)

시그널은 라디오 방송국과 같습니다. 신호를 보낼 노드에서 signal 시그널이름으로 방송국을 개설하고, 원하는 타이밍에 emit() 함수를 호출하여 주파수를 쏘아 보내면 됩니다.

GDScript
 
extends Node2D

# 1. 'died'라는 이름의 나만의 커스텀 시그널을 선언합니다.
signal died

var hp = 10

func take_damage(amount):
    hp -= amount
    if hp <= 0:
        # 2. 체력이 0 이하가 되면 'died' 시그널을 사방에 발송(emit)합니다!
        died.emit()
        queue_free()

2. 코드로 시그널 연결하기 (.connect)

방송을 선언했으면, 청취자(수신할 노드)가 그 방송을 듣겠다고 신청해야 합니다. 고도 엔진에서는 에디터의 '노드(Node)' 탭을 통해 마우스로 연결할 수도 있지만, 스크립트에서 .connect() 함수를 사용해 역동적으로 연결하는 것이 유지보수에 좋습니다.

GDScript
 
extends Node

@onready var enemy = $Enemy
var score = 0

func _ready():
    # 1. enemy 노드의 'died' 시그널을 현재 스크립트의 '_on_enemy_died' 함수에 연결합니다.
    enemy.died.connect(_on_enemy_died)

# 2. 시그널을 수신했을 때 실제로 실행될 함수(콜백 함수)입니다.
func _on_enemy_died():
    score += 100
    print("적이 사망하여 점수가 올랐습니다! 현재 점수: ", score)

3. 시그널에 데이터(값) 실어 보내기

시그널의 진짜 강력함은 신호를 보낼 때 특정 데이터(숫자, 문자열 등)를 함께 실어서 보낼 수 있다는 점입니다. 시그널을 선언할 때 괄호 안에 변수를 지정해 주면 됩니다.

GDScript
 
extends Node2D

# 시그널을 선언할 때 보낼 데이터의 이름과 타입을 괄호 안에 적어줍니다.
signal hp_changed(new_hp: int)

var hp = 100

func take_damage(amount):
    hp -= amount
    # 신호를 보낼 때(emit) 변경된 현재 체력 값을 함께 실어서 보냅니다.
    hp_changed.emit(hp)

 

GDScript
 
extends ProgressBar

@onready var player = %Player

func _ready():
    # 플레이어의 체력 변경 시그널을 UI 업데이트 함수와 연결합니다.
    player.hp_changed.connect(_on_player_hp_changed)

# 시그널이 넘어올 때 실려온 데이터(new_hp)를 그대로 받아서 사용합니다.
func _on_player_hp_changed(new_hp: int):
    value = new_hp # 체력바 UI의 게이지를 실시간으로 변경

한눈에 보는 시그널(Signal) 핵심 요약

키워드 / 함수 기능 설명 게임 속 사용 예시
signal 이름 스크립트 최상단에서 새로운 커스텀 신호(방송국)를 개설함 signal game_over, signal item_picked_up 등 선언
시그널.emit() 선언된 시그널을 주변의 모든 노드에 발송(방출)함 보스가 죽는 순간 전역에 사망 신호를 뿜어낼 때
대상.시그널.connect(함수) 대상 노드의 신호를 감지하면 특정 함수를 실행하도록 연결함 스위치 노드의 '눌림' 신호와 문의 '열림' 함수를 이어줄 때
signal 이름(인자) 신호와 함께 중요한 데이터(값)를 묶어서 발송함 아이템을 먹었을 때 어떤 아이템(이름, ID)을 먹었는지 UI에 전달할 때
반응형