제미니 답변:
고도 엔진(Godot Engine)에서 preload()로 불러온 에셋을 생성하는 방법에는 **new()**를 사용하는 경우와 **instantiate()**를 사용하는 경우가 있으며, 이 둘은 생성하는 대상과 방식에 명확한 차이가 있습니다.
1. 생성 대상의 차이
| 방식 | 생성 대상 | 설명 |
| new() | 스크립트(Script) 또는 리소스(Resource) | new()는 Resource 또는 Script와 같은 클래스 인스턴스(객체)를 메모리상에 새로 생성합니다. |
| instantiate() | 장면(PackedScene) | instantiate()는 PackedScene 리소스를 기반으로 노드 트리의 복제본을 생성합니다. |
Export to Sheets
2. 작동 방식 및 사용 목적
A. new()로 생성하기
preload를 사용하여 .gd 파일이나 .tres, .res 파일을 불러올 때 주로 사용됩니다.
GDScript
# Resource를 new()로 생성하는 예시 (예: CustomResource.gd)
const CustomResource = preload("res://CustomResource.gd")
var new_resource = CustomResource.new()
# CustomResource 클래스의 새로운 인스턴스를 생성
- 용도: 스크립트 클래스 (클래스 이름이 지정된 .gd 파일)나 리소스 객체를 코드에서 직접 만들 때 사용합니다.
- 특징: 메모리상에 새로운 객체를 만듭니다. 노드(Node)나 장면(Scene)의 계층 구조를 복제하지 않습니다.
B. instantiate()로 생성하기
preload를 사용하여 .tscn (장면) 파일을 불러올 때 사용되는 유일한 방법입니다.
GDScript
# PackedScene을 instantiate()로 생성하는 예시 (.tscn 파일)
const PlayerScene = preload("res://Player.tscn")
var new_player = PlayerScene.instantiate()
get_parent().add_child(new_player)
# Player.tscn에 정의된 노드 트리의 복제본(인스턴스)을 생성
- 용도: .tscn 파일로 저장된 장면(Scene) 전체를 메모리에 로드하고, 그 **노드 트리의 복제본(인스턴스)**을 만들 때 사용합니다.
- 특징: PackedScene 리소스를 기반으로 하며, 장면의 루트 노드와 모든 자식 노드, 그리고 그와 연결된 스크립트와 속성까지 모두 복제하여 새로운 인스턴스를 생성합니다. 이는 게임에서 캐릭터, 발사체, 아이템 등을 동적으로 생성하는 표준적인 방법입니다.
3. 요약 및 핵심 차이
| 특징 | new() | instantiate() |
| 주요 대상 | Script 또는 Resource | PackedScene (장면 파일 .tscn) |
| 작동 결과 | 단순한 객체 인스턴스 생성 | 노드 트리의 복제본(Scene Instance) 생성 |
| 언제 사용? | 데이터 객체나 유틸리티 클래스 등, 노드 트리에 종속되지 않는 객체를 만들 때 | 플레이어, 적, 효과 등 장면 전체를 게임에 추가할 때 |
Export to Sheets
따라서 .tscn 파일을 불러왔다면 **반드시 instantiate()**를 사용해야 하며, .gd 파일 등의 스크립트나 리소스를 불러와 새로운 객체를 만들 때는 new()를 사용합니다.
'개발 > 고도 엔진.Godot engine' 카테고리의 다른 글
| 고도엔진 Godot 4.5 / 트윈(Tween) (0) | 2025.10.08 |
|---|---|
| 고도엔진 Godot 4.5 / distance_squared_to()와 distance_to()의 차이 (0) | 2025.10.06 |
| 고도엔진 Godot 4.5 / ORM 텍스처 / Ambient Occlusion, Roughness, Metallic (0) | 2025.10.02 |
| 고도엔진 Godot 4.5 / as 타입 캐스팅(Type Casting) (0) | 2025.10.02 |
| 고도엔진 Godot 4.5 / multiplayer.is_server(), is_multiplayer_authority() 비교 (0) | 2025.09.24 |
