Menu
CoddyTech

시그널이란?

Coddy GDScript 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 65개 중 35번째.

게임이 실행되는 동안 객체에는 여러 일이 일어납니다. 동전을 획득하고, 문이 열리고, 영웅의 hp가 0으로 떨어집니다. 프로그램의 다른 부분은 이러한 이벤트에 반응합니다. 점수가 올라가고, 소리가 재생되고, 게임 오버 화면이 나타납니다.

시그널은 어떤 객체에 일이 일어났을 때 그 객체가 보내는 메시지입니다. 객체가 시그널을 발신하면, 해당 시그널에 연결된 모든 함수가 실행됩니다:

# coin.gd
class_name Coin
extends RefCounted

signal collected

func collect() -> void:
	print("Coin picked up")
	collected.emit()

signal collected은 신호를 선언하고 collected.emit()은 신호를 보냅니다. 코인은 누가 듣고 있는지 알지 못합니다. 코인에 관심이 있는 코드는 자체 함수 중 하나를 신호에 연결합니다:

# main.gd
func _ready():
	var coin := Coin.new()
	coin.collected.connect(_on_coin_collected)
	coin.collect()
	print("Done")

func _on_coin_collected() -> void:
	print("Score +1")

출력은 Coin picked up, Score +1, Done입니다. 신호를 발생시키면 emit() 다음 줄보다 먼저 연결된 함수들이 즉시 실행됩니다. 연결된 함수가 없는 신호는 발생시켜도 아무 동작도 하지 않습니다.

신호가 없다면 collect()가 점수 코드를 직접 호출해야 하므로 모든 동전이 점수판을 참조해야 합니다. 신호를 사용하면 동전은 이벤트만 알리고, 원하는 수의 리스너가 이에 반응할 수도 있고 아무도 반응하지 않을 수도 있습니다.

Godot 자체 노드도 같은 방식으로 작동합니다. Button은 클릭되면 pressed를 내보내고, Timer는 시간이 다 되면 timeout을 내보냅니다.

challenge icon

챌린지

쉬움

우편함은 신호를 통해 새 메일이 도착했음을 알립니다. Mailbox에는 이미 signal mail_arrived가 선언되어 있고 letters 카운터가 있습니다. deliver(kind)를 작성하세요.

  • kind가 "letter"이면 letters에 1을 더하고 mail_arrived를 발생시키세요.
  • 그 밖의 종류(광고, 전단지)는 버려집니다. 아무것도 바뀌지 않고 아무 신호도 발생하지 않습니다.

제공된 코드는 You've got mail!을 출력하는 함수를 연결한 다음, 뒤따르는 줄의 수를 읽고 각 줄을 전달합니다. away라는 줄은 해당 함수의 연결을 해제하고 home은 다시 연결하므로, 자리를 비운 동안 도착한 편지는 개수에 포함되지만 알림은 표시되지 않습니다. 다음 줄이 letter, ad, away, letter일 때 출력 결과는 다음과 같습니다.

Delivering: letter
You've got mail!
Delivering: ad
Delivering: letter
Letters: 2

코드는 mailbox.gd에 작성하세요. main.gd에는 제공된 입력/출력 코드가 있으며 수정할 수 없습니다.

직접 해보기

extends Node

func _ready():
	# 제공된 입력/출력 코드: 그대로 유지하세요
	var mailbox := Mailbox.new()
	mailbox.mail_arrived.connect(_on_mail_arrived)
	var count := int(OS.read_string_from_stdin())
	for i in count:
		var line := OS.read_string_from_stdin()
		if line == "away":
			mailbox.mail_arrived.disconnect(_on_mail_arrived)
		elif line == "home":
			mailbox.mail_arrived.connect(_on_mail_arrived)
		else:
			print("Delivering: ", line)
			mailbox.deliver(line)
	print("Letters: ", mailbox.letters)

func _on_mail_arrived() -> void:
	print("You've got mail!")
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

객체 지향 프로그래밍의 모든 레슨

직접 연습해 보세요: 온라인 GDScript 컴파일러