Menu
CoddyTech

컴포넌트로서의 노드

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

Node에는 자식 노드가 있을 수 있습니다. Godot은 이런 방식으로 게임 오브젝트를 구성합니다. 영웅 노드에는 체력이나 이동과 같은 각 능력마다 자식 노드가 하나씩 생깁니다. 각 자식은 컴포넌트입니다. 한 가지 작업을 수행하는 작은 노드입니다.

# health.gd
class_name Health
extends Node

var hp := 10

func _ready() -> void:
	print("Health ready")

# hero.gd
class_name Hero
extends Node

func _init() -> void:
	var health := Health.new()
	health.name = "Health"
	add_child(health)

func _ready() -> void:
	print("Hero ready, hp: ", $Health.hp)

add_child()는 노드를 자식으로 추가합니다. 각 구성 요소에 name을 지정하세요. get_node("Health") 또는 짧은 형식인 $Health를 사용하면 해당 이름의 자식을 찾습니다. 이름이 없거나 형제 노드가 이미 사용 중인 이름을 가진 노드에는 @Node@4와 같은 자동 이름이 지정됩니다.

노드의 _ready()는 노드가 게임이 실행되는 노드 트리인 씬 트리에 들어갈 때 실행됩니다. main.gd는 트리에 있으므로, 여기에 영웅을 추가하면 두 _ready() 메서드가 모두 실행되며 자식의 메서드가 먼저 실행됩니다:

# main.gd
var hero := Hero.new()
add_child(hero)            # Health 준비 완료, 그다음 Hero 준비 완료, hp: 10
print(hero.get_child_count())   # 1

부모 노드는 get_children()(추가된 순서대로 정렬된 자식 노드 배열), get_child_count() 및 has_node("Health")를 사용해 구성 요소에 접근합니다. 트리의 노드는 게임이 끝날 때 트리와 함께 해제되므로, add_child()로 추가한 구성 요소는 따로 정리할 필요가 없습니다.

challenge icon

챌린지

쉬움

구성 요소 노드로 로봇을 만드세요.

  • Part는 Node를 확장합니다. 생성자는 부품 이름과 전력 값을 받습니다. 전력 값을 저장하고 노드의 name을 부품 이름으로 설정합니다. 부품이 씬 트리에 들어가면 _ready()가 Laser attached를 출력합니다.
  • Robot은 Node를 확장합니다. add_part(part_name, power)는 새로운 Part를 자식으로 추가합니다. 로봇에 이미 해당 이름을 가진 자식이 있으면 Laser is already attached를 출력하고 아무것도 생성하지 않습니다.
  • total_power()는 모든 부품의 전력 합계를 반환합니다.

제공된 코드는 로봇을 씬 트리에 추가하고, 이어질 명령의 개수를 읽은 다음(add Laser 5, power) 마지막에 부품 수를 출력합니다. add Laser 5, add Wheels 2, power, add Laser 9, add Arm 3, power를 입력하면 다음을 출력합니다.

Laser attached
Wheels attached
Total power: 7
Laser is already attached
Arm attached
Total power: 10
Parts: 3

코드는 part.gd와 robot.gd에 작성합니다. main.gd에는 제공된 입력/출력 코드가 있으며 수정할 수 없습니다.

직접 해보기

extends Node

func _ready():
	# 제공된 입출력 코드: 그대로 유지하세요
	var robot := Robot.new()
	add_child(robot)
	var count := int(OS.read_string_from_stdin())
	for i in count:
		var parts := OS.read_string_from_stdin().split(" ")
		if parts[0] == "add":
			robot.add_part(parts[1], int(parts[2]))
		else:
			print("Total power: ", robot.total_power())
	print("Parts: ", robot.get_child_count())
quiz icon실력 점검

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

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

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