Menu
CoddyTech

선언과 발생

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

키워드 signal과 이름을 사용해 신호를 선언하고, 클래스 맨 위의 변수 옆에 둡니다. 신호 이름은 이미 발생한 이벤트를 snake_case로 나타냅니다: died, door_opened, leveled_up. 클래스는 필요한 만큼 신호를 선언합니다:

# player.gd
class_name Player
extends RefCounted

signal leveled_up
signal max_level_reached

const MAX_LEVEL := 3
var level := 1
var xp := 0

func add_xp(amount: int) -> void:
	xp += amount
	while xp >= 100 and level < MAX_LEVEL:
		xp -= 100
		level += 1
		leveled_up.emit()
		if level == MAX_LEVEL:
			max_level_reached.emit()

이벤트가 발생하는 순간에만 신호를 발생시키세요. 새 플레이어에게 add_xp(50)를 호출해도 아무것도 발생하지 않습니다. 그 후 xp가 300이 되도록 add_xp(250)를 호출하면 leveled_up이 레벨을 얻을 때마다 한 번씩 총 두 번 발생하고, max_level_reached는 레벨 3에 도달하는 레벨 업 시 한 번 발생합니다.

속성 세터는 신호를 내보내기에 좋은 위치입니다. 값이 변경될 때마다 신호가 발생하기 때문입니다:

signal died

var hp: int = 10:
	set(value):
		var was_alive := hp > 0
		hp = maxi(value, 0)
		if was_alive and hp == 0:
			died.emit()

was_alive는 HP가 0인 영웅이 한 번 더 공격받을 때 died가 다시 발생하지 않도록 합니다.

시그널은 텍스트로 된 이름을 통해서도 접근할 수 있습니다. emit_signal("died")는 시그널을 발생시키고, hero.connect("died", _on_hero_died)는 시그널에 연결하며, hero.has_signal("died")는 true를 반환합니다. 객체가 선언하지 않은 이름에 연결하면 해당 줄이 실행될 때 오류가 발생합니다.

challenge icon

챌린지

쉬움

카운트다운을 하며 각 단계를 신호로 알리는 Bomb를 작성하세요.

  • 신호 두 개를 선언하세요: beeped와 exploded.
  • tick()은 fuse를 1만큼 줄입니다. 퓨즈가 여전히 0보다 크면 beeped를 내보내고, 0에 도달하면 exploded를 내보내세요.
  • 퓨즈가 0이 되면 폭탄이 폭발한 것입니다. 이후의 틱은 아무 동작도 하지 않으며 아무 신호도 내보내지 않습니다.

제공된 코드는 시작 퓨즈 값과 실행할 틱 수를 읽고, 이름으로 두 신호에 연결한 뒤 연결된 함수에서 Beep와 BOOM!을 출력하고, 마지막에 남은 퓨즈 값을 출력합니다. 퓨즈가 3이고 틱이 5번이면 다음을 출력합니다:

Beep
Beep
BOOM!
Fuse: 0

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

직접 해보기

extends Node

func _ready():
	# 제공된 입출력 코드: 그대로 유지하세요
	var bomb := Bomb.new(int(OS.read_string_from_stdin()))
	# 시그널의 이름을 텍스트로 지정해 connect() 호출
	bomb.connect("beeped", _on_beeped)
	bomb.connect("exploded", _on_exploded)
	var ticks := int(OS.read_string_from_stdin())
	for i in ticks:
		bomb.tick()
	print("Fuse: ", bomb.fuse)

func _on_beeped() -> void:
	print("Beep")

func _on_exploded() -> void:
	print("BOOM!")
quiz icon실력 점검

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

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

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