godot-gdscript-patterns은(는) 무엇을 하나요?
Godot 4 GDScript 패턴(시그널, 씬, 상태 머신, 최적화)을 마스터합니다. Godot 게임을 빌드하거나, 게임 시스템을 구현하거나, GDScript 모범 사례를 학습할 때 사용하세요.
시그널 (Signals)
시그널은 Godot에서 노드 간 통신을 위한 기본 메커니즘입니다. 게임 오브젝트 간 결합도를 낮추는 데 필수적입니다.
- 내장 시그널:
node.connected.connect(callable) - 커스텀 시그널:
signal health_changed(new_health) - 시그널 방출:
health_changed.emit(current_health)
# SignalExample.gd
extends Node
signal health_changed(new_health: int)
var current_health: int = 100
func take_damage(amount: int) -> void:
current_health -= amount
if current_health < 0:
current_health = 0
health_changed.emit(current_health)
씬과 인스턴싱 (Scenes & Instancing)
씬은 게임 객체의 재사용 가능한 템플릿입니다. 씬 인스턴싱은 동적 객체 생성을 가능하게 합니다.
- 씬 로딩:
var scene = preload("res://path/to/scene.tscn") - 인스턴싱:
var instance = scene.instantiate() - 자식 노드로 추가:
add_child(instance)
# Spawner.gd
extends Node2D
var bullet_scene: PackedScene = preload("res://Bullet.tscn")
func spawn_bullet(position: Vector2, direction: Vector2) -> void:
var bullet = bullet_scene.instantiate()
bullet.global_position = position
bullet.direction = direction
add_child(bullet)
상태 머신 (State Machines)
상태 머신은 복잡한 게임 로직을 관리 가능한 상태로 분해합니다. Godot에서 다양한 방식으로 구현할 수 있습니다.
- enum 사용:
enum State { IDLE, WALK, JUMP, ATTACK } - switch 문법: GDScript의
match활용 - 상태 전환 조건: 입력, 시간, 충돌 등
# StateMachine.gd
extends Node
enum PlayerState { IDLE, WALK, JUMP, ATTACK }
var current_state: PlayerState = PlayerState.IDLE
func _process(delta: float) -> void:
match current_state:
PlayerState.IDLE:
handle_idle(delta)
PlayerState.WALK:
handle_walk(delta)
PlayerState.JUMP:
handle_jump(delta)
PlayerState.ATTACK:
handle_attack(delta)
func transition_to(new_state: PlayerState) -> void:
current_state = new_state
최적화 (Optimization)
성능 최적화는 부드러운 게임 플레이를 위해 중요합니다.
- 콜 수 최소화:
_physics_process에서 불필요한 호출 제거 - 메모리 관리: 참조 카운팅과 리소스 풀 활용
- 프로파일링: Godot 디버거 사용법
# ObjectPool.gd
extends Node
var pooled_objects: Array[Node] = []
func get_object() -> Node:
if pooled_objects.is_empty():
return create_new_object()
else:
var obj = pooled_objects.pop_back()
obj.visible = true
obj.process_mode = PROCESS_MODE_INHERIT
return obj
func return_object(obj: Node) -> void:
obj.visible = false
obj.process_mode = PROCESS_MODE_DISABLED
pooled_objects.append(obj)
모범 사례 (Best Practices)
- 온전한 경로 사용:
@export변수를 선호하고get_node()대신 사용 - 타입 힌트: GDScript의 타입 시스템을 적극 활용
- 에디터 통합: 에디터 플러그인과 커스텀 리소스 활용
더 자세한 내용은 공식 문서를 참조하세요.