Attention: Here be dragons
This is the latest
(unstable) version of this documentation, which may document features
not available in or compatible with released stable versions of Godot.
Checking the stable version of the documentation...
인스턴스 만들기
참고
This tutorial refers to instantiating scenes in the editor. To learn how to instantiate scenes from code, see 노드와 씬 인스턴스.
Godot's approach to instantiation described below should not be confused with hardware instancing that can be used to render large amounts of similar objects quickly. See 최적화(Optimization) instead.
이전 파트에서는 씬이 하나의 루트 노드를 가진 트리 구조로 조직된 노드 모음임을 알아보았습니다. 프로젝트를 여러 씬으로 분할할 수 있습니다. 이 기능은 게임의 다양한 컴포넌트를 분리하고 조직하는 데 도움이 됩니다.
원하는 만큼 씬을 만들고 "text scene"을 뜻하는 .tscn 확장자 파일로 저장할 수 있습니다. 이전 단원의 label.tscn 파일이 그 예입니다. 이런 파일을 씬 내용에 대한 정보를 담고 있기 때문에 "패킹된 씬"이라고 부릅니다.
다음은 공의 예입니다. 루트로 Ball이라는 이름의 RigidBody2D 노드가 있고, 이 노드 덕분에 공이 떨어지고 벽에 튕길 수 있습니다. 여기에 Sprite2D 노드와 CollisionShape2D도 들어 있습니다.
Once you have saved a scene, it works as a blueprint: you can reproduce it in other scenes as many times as you'd like. Replicating an object from a template like this is called instantiation.
As we mentioned in the previous part, instantiated scenes behave like a node: the editor hides their content by default. When you instantiate the Ball, you only see the Ball node. Notice also how each duplicate has a unique name.
Ball 씬의 각 인스턴스는 ball.tscn과 동일한 구조와 속성으로 시작합니다. 하지만 각 인스턴스는 독립적으로 수정할 수 있습니다. 예를 들어 튕기는 방식이나 무게, 또는 원본 씬이 노출하는 어떤 속성이든 바꿀 수 있습니다.
연습해보기
Let's use instantiation in practice to see how it works in Godot. We invite you to download the ball's sample project we prepared for you: instancing_starter.zip.
압축 파일을 컴퓨터에 풀어 주세요. 가져오려면 프로젝트 관리자(Project Manager)가 필요합니다. Godot를 실행하면 프로젝트 관리자에 접근할 수 있고, Godot를 이미 열어 둔 상태라면 (Ctrl + Shift + Q, macOS에서는 Ctrl + Option + Cmd + Q)을 클릭하세요.
In the Project Manager, click the button.
In the file dialog that appears, navigate to the folder you extracted.
Double-click the project.godot file to select it.
Finally, click the button to import the project.
프로젝트가 마지막으로 더 오래된 Godot 버전에서 열렸다는 알림 창이 나타날 수 있습니다. 문제 없습니다. 을 눌러 프로젝트를 여세요.
The project contains two packed scenes: main.tscn, containing walls against
which the ball collides, and ball.tscn. The main scene should open
automatically. If you're seeing an empty 3D scene instead of the main scene, click the 2D button at the top of the screen.
Main 노드의 자식으로 볼을 추가해 보겠습니다. 씬 독에서 Main 노드를 선택한 다음, 씬 독 상단에 있는 링크 아이콘을 클릭하세요. 이 버튼을 사용하면 현재 선택된 노드의 자식으로 씬의 인스턴스를 추가할 수 있습니다.
Double-click the ball scene to instantiate it.
ball이 좌상단 구석의 뷰 포트에 나옵니다.
클릭한 후에 화면의 중앙으로 드래그하세요.
F5 (macOS에서는 Cmd + B)를 눌러 게임을 실행하세요. 공이 떨어지는 것이 보여야 합니다.
Now, we want to create more instances of the Ball node. With the ball still selected, press Ctrl + D (Cmd + D on macOS) to duplicate it. Click and drag the new ball to a different location.
씬에 몇 개를 가지더라도 반복할 수 있습니다.
게임을 다시 실행하세요. 이제 각각의 볼이 서로 독립적으로 떨어지는 것을 볼 수 있을 것입니다. 이것이 인스턴스의 동작 방식입니다. 각 인스턴스는 템플릿 씬의 독립적인 복제품입니다.
씬과 인스턴스 편집하기
인스턴스에는 더 많은 기능이 있습니다. 이 기능을 사용하면 다음과 같은 작업을 수행할 수 있습니다:
다른 것에 영향을 주지 않고서도 Inspector를 사용해 ball 하나의 속성을 바꿉니다.
모든 Ball의 디폴트 속성을 변경하려면
ball.tscn씬을 열고 Ball 노드에서 변경사항을 수행하세요. 저장하면 프로젝트 안에 있는 모든 Ball의 인스턴스 값이 업데이트됩니다.
참고
인스턴스의 속성을 변경하면 해당 패킹된 씬의 값이 항상 오버라이드합니다.
이를 시도해 봅시다. 파일시스템에서 ball.tscn 을 더블 클릭하여 이를 여세요.
왼쪽에 씬 독에서 Ball 노드를 선택하세요. 그런 다음 오른쪽에 Inspector에서 PhysicsMaterial속성을 클릭하여 확장하세요.
바운스 속성을 0.5로 설정하기 위해 숫자 필드를 클릭하고, 0.5를 입력한 다음 Enter를 누르세요.
F5(macOS에서는 Cmd + B)를 눌러 게임을 실행하고 모든 볼이 이제 훨씬 더 많이 튀는 것을 확인하세요. 볼 씬은 모든 인스턴스의 템플릿이므로 수정하고 저장하면 모든 인스턴스가 해당 내용을 업데이트합니다.
Let's now adjust an individual instance. Head back to the main scene by clicking on the corresponding tab above the viewport.
Select one of the instantiated Ball nodes and, in the Inspector, set its
Gravity Scale value to 10.
A gray "revert" button appears next to the adjusted property.
이 아이콘은 씬에서 팩된 소스의 값을 오버라이드했다는 것을 알려줍니다. 원본 씬의 속성을 수정하더라도 인스턴스에 오버라이드된 값이 보존됩니다. 복구 아이콘을 누르면 저장된 씬에서 속성 값을 불러옵니다.
게임을 다시 실행하여 이 Ball이 다른 것보다 훨씬 빠르게 떨어지는지 봅시다.
참고
한 인스턴스의 물리 머티리얼 값을 변경하면 다른 모든 인스턴스에도 영향을 미칩니다. 이는 물리 머티리얼이 리소스이고 인스턴스 간에 리소스가 공유되기 때문입니다. 한 인스턴스에 대해 리소스를 고유하게 만들려면 Inspector에서 해당 리소스를 마우스 오른쪽 버튼으로 클릭하고 상황에 맞는 메뉴에서 유일하게 만들기를 클릭하세요.
리소스는 우리가 이후 강의에서 다룰 Godot 게임의 또 다른 필수 구성 요소입니다.
디자인 언어로서의 씬 인스턴스
Godot의 인스턴스와 씬은 뛰어난 디자인 언어를 제공하여 다른 엔진과 차별화됩니다. 우리는 처음부터 이 개념을 중심으로 Godot를 디자인했습니다.
Godot로 게임을 만들 때는 모델-뷰-컨트롤러(MVC)이나 엔터티-관계 다이어그램과 같은 아키텍처 코드 패턴은 잊어버리세요. 대신, 플레이어가 게임에서 보게 될 요소를 상상하고 이를 중심으로 코드를 구성하면 됩니다.
예를 들어 슈팅 게임을 다음과 같이 분류할 수 있습니다:
거의 모든 유형의 게임에 대해 이와 같은 다이어그램을 만들 수 있습니다. 각 사각형은 플레이어의 관점에서 게임에서 볼 수 있는 엔티티를 나타냅니다. 화살표는 어떤 씬이 어떤 씬을 소유하고 있는지 알려줍니다.
Once you have a diagram, we recommend creating a scene for each element listed in it to develop your game. You'll use instantiation, either by code or directly in the editor, to build your tree of scenes.
게임을 (혹은 일반적으로 소프트웨어를) 프로그래밍할 때 가장 오래 걸리는 부분은 구조를 설계하고 게임의 컴포넌트를 그 구조에 알맞게 끼워 넣는 것입니다. 이 방법을 대체하기 위해 씬을 기반으로 설계하면 게임의 논리 자체에 집중하게 되어서, 개발을 좀 더 빠르고 직관적으로 만듭니다. 대부분의 게임 컴포넌트가 그대로 씬이 되기 때문에, 씬 인스턴스화를 기반으로 한 설계를 사용하는 것은 다른 구조적 코드가 필요하지 않게 되기 때문입니다.
많은 애셋과 중첩된 요소들로 이루어진 오픈월드 게임의 복잡한 예를 하나 더 살펴보겠습니다:
Imagine we started by creating the room. We could make a couple of different room scenes, with unique arrangements of furniture in them. Later, we could make a house scene that uses multiple room instances for the interior. We would create a citadel out of many instantiated houses and a large terrain on which we would place the citadel. Each of these would be a scene instantiating one or more sub-scenes.
나중에는 경호원 (그리고 다른 NPC)의 씬을 만들고 마찬가지로 성에 추가할 수 있습니다. 그 결과, 씬들은 게임 세상 전체에 간접적으로 추가됩니다.
Godot에서는 한 번 만든 씬을 더 많은 씬으로 인스턴스하는 방식으로 작업을 쉽게 반복할 수 있습니다. 게다가 편집기는 프로그래머에게도 비 프로그래머에게도 친근하게 설계되었습니다. 일반적인 팀 개발 과정에는 2D나 3D 아티스트, 레벨 디자이너, 게임 디자이너, 애니메이터가 있지만, 모두 편집기 인터페이스에서 작업합니다.
요약
Instantiation, the process of producing an object from a blueprint, has many handy uses. With scenes, it gives you:
Bar와 Counter를 다시 사용할 수 있는 UI 컴포넌트로 바꾸기
복잡한 시스템을 구조화하고 캡슐화하는 도구.
게임 프로젝트의 구조를 자연스러운 방법으로 생각하기 위한 언어.