이 카테고리는 고도 엔진(Godot Engine) 관련 문법을 기록하고 저장하기 위해 만든 공간입니다.
이번에는 게임 플레이 도중 플레이어가 총을 쏘면 총알이 나타나고, 보스가 몬스터를 소환하며, 몬스터가 죽으면서 아이템을 떨어뜨립니다. 이처럼 게임이 실행되는 도중에 실시간으로 새로운 오브젝트를 만들어내는 것은 게임 개발의 핵심입니다. 고도 엔진에서는 미리 만들어둔 씬(Scene)을 코드를 통해 찍어내는(Instantiate) 방식으로 이 작업을 수행합니다. 총알 발사를 예시로 씬을 동적으로 생성하는 3단계를 알아보겠습니다.
1. preload(): 씬 설계도 가져오기
무언가를 찍어내려면 먼저 '설계도'가 필요합니다. 고도 엔진에서는 미리 만들어 저장해 둔 .tscn 파일이 바로 설계도(PackedScene) 역할을 합니다. 스크립트 맨 위에서 preload() 함수를 사용해 이 씬 파일을 메모리에 미리 불러옵니다.
참고: 파일 시스템(FileSystem) 패널에서 .tscn 파일을 클릭한 채로 스크립트 에디터 창으로 드래그 앤 드롭하면 복잡한 경로를 직접 칠 필요 없이 쉽게 입력할 수 있습니다.
# Bullet.tscn 씬 파일을 설계도로 사용하기 위해 불러옵니다.
# 씬 로드는 상수(const)나 @onready 변수에 할당하는 것이 일반적입니다.
const BULLET_SCENE = preload("res://Scenes/Bullet.tscn")
2. instantiate(): 설계도로 실체(노드) 만들기
설계도를 가져왔다면, 이제 총을 쏠 때마다 이 설계도를 바탕으로 실제 '총알 노드'를 만들어야 합니다. 이때 사용하는 함수가 instantiate()입니다. 이 함수는 씬과 똑같이 생긴 복제본을 메모리상에 뚝딱 만들어냅니다.
(※ 참고: 고도 엔진 3버전에서 사용하던 instance() 함수가 4버전에서는 instantiate()로 이름이 변경되었습니다.)
func shoot():
# 1. 씬 설계도를 바탕으로 실제 총알 노드(인스턴스)를 생성합니다.
var bullet_instance = BULLET_SCENE.instantiate()
# 2. 방금 만들어진 총알의 출발 위치를 플레이어(혹은 총구)의 위치로 맞춥니다.
bullet_instance.global_position = self.global_position
3. add_child(): 게임 세상(씬 트리)에 등장시키기
instantiate()로 총알을 만들고 위치까지 정해줬지만, 아직 게임 화면에는 보이지 않을 것입니다. 고도 엔진에서는 모든 노드가 '씬 트리(Scene Tree)'라는 족보에 등록되어야만 비로소 화면에 나타나고 작동하기 때문입니다. 마지막으로 add_child() 함수를 사용해 이 총알을 씬 트리에 추가해주면 발사 과정이 끝납니다!
func shoot():
var bullet_instance = BULLET_SCENE.instantiate()
bullet_instance.global_position = self.global_position
# 3. 씬 트리에 총알을 추가하여 게임 화면에 실제로 등장시킵니다.
# (주의: 단순히 add_child(bullet_instance)를 하면 총알이 플레이어의 자식이 되어
# 플레이어가 이동할 때 총알도 같이 따라다니는 어색한 상황이 발생할 수 있습니다.
# 따라서 보통 씬 트리의 최상위 노드나 별도의 컨테이너 노드에 추가하는 것이 좋습니다.)
get_tree().root.add_child(bullet_instance)
한눈에 보는 씬 생성(Instantiate) 핵심 요약
| 함수 / 키워드 | 기능 설명 | 실전 활용 예시 |
| preload(경로) | 게임 실행 전, 지정된 경로의 씬(.tscn)을 미리 메모리에 불러옵니다. | 총알, 몬스터, 파티클 등 게임 도중 자주 생성되는 씬의 설계도를 저장해 둘 때 |
| instantiate() | 불러온 씬(PackedScene)을 바탕으로 실제 노드(복제본)를 메모리에 생성합니다. | 마우스 클릭이나 공격 버튼을 누를 때마다 새로운 총알 오브젝트를 만들어낼 때 |
| add_child(노드) | 생성된 노드를 씬 트리에 자식으로 추가하여 화면에 나타나게 합니다. | 만들어진 총알이나 소환된 몬스터를 게임 세상에 실제로 등장시킬 때 |
| queue_free() | (보너스) 노드를 안전하게 삭제하고 메모리를 비워줍니다. | 벽이나 몬스터에 맞거나 화면 밖으로 멀리 날아간 총알을 없앨 때 |
'게임 > 고도엔진 문법' 카테고리의 다른 글
| 23. [고도 엔진] 예측 불가능한 재미: 난수 생성기(randi, randf) 활용법 (0) | 2026.07.11 |
|---|---|
| 21. [고도 엔진] 키보드와 마우스 입력받기: Input 싱글톤과 _input() 함수 (0) | 2026.07.09 |
| 20. [고도 엔진] 에러 처리와 디버깅 팁 (assert, print_debug, 중단점 활용) (0) | 2026.07.08 |