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...
인스턴스 만들기
참고
이 튜토리얼은 편집기에서 씬을 인스턴스화하는 것을 다룹니다. 코드에서 씬을 인스턴스화하는 방법을 배우려면 노드와 씬 인스턴스 를 참조하세요.
아래 설명된 Godot의 인스턴스화 방식은 많은 양의 유사한 오브젝트를 빠르게 렌더링하는 데 사용할 수 있는 하드웨어 인스턴스화와 혼동해서는 안 됩니다. 대신 최적화(Optimization) 를 참조하세요.
이전 파트에서는 씬이 하나의 루트 노드를 가진 트리 구조로 조직된 노드 모음임을 알아보았습니다. 프로젝트를 여러 씬으로 분할할 수 있습니다. 이 기능은 게임의 다양한 컴포넌트를 분리하고 조직하는 데 도움이 됩니다.
원하는 만큼 씬을 만들고 "text scene"을 뜻하는 .tscn 확장자 파일로 저장할 수 있습니다. 이전 단원의 label.tscn 파일이 그 예입니다. 이런 파일을 씬 내용에 대한 정보를 담고 있기 때문에 "패킹된 씬"이라고 부릅니다.
다음은 공의 예입니다. 루트로 Ball이라는 이름의 RigidBody2D 노드가 있고, 이 노드 덕분에 공이 떨어지고 벽에 튕길 수 있습니다. 여기에 Sprite2D 노드와 :ref:`CollisionShape2D <class_CollisionShape2D>`도 들어 있습니다.
씬을 저장하고 나면 청사진처럼 동작합니다. 원하는 만큼 다른 씬에서 재사용할 수 있습니다. 이렇게 템플릿에서 객체를 복제하는 것을 **인스턴스화**라고 합니다.
이전 파트에서 언급한 바와 같이, 인스턴스화된 씬은 노드처럼 동작합니다: 기본적으로 편집기는 그 내용을 숨깁니다. Ball을 인스턴스화하면 Ball 노드만 표시됩니다. 또한 각 복제본은 고유한 이름을 가지고 있음을 주목하세요.
Ball 씬의 각 인스턴스는 ``ball.tscn``과 동일한 구조와 속성으로 시작합니다. 하지만 각 인스턴스는 독립적으로 수정할 수 있습니다. 예를 들어 튕기는 방식이나 무게, 또는 원본 씬이 노출하는 어떤 속성이든 바꿀 수 있습니다.
연습해보기
이제 Godot에서 인스턴스화가 실제로 어떻게 작동하는지 보기 위해 직접 사용해 봅시다. 이를 위해 준비한 공 샘플 프로젝트를 다운로드해 주세요: instancing_starter.zip.
압축 파일을 컴퓨터에 풀어 주세요. 가져오려면 프로젝트 관리자(Project Manager)가 필요합니다. Godot를 실행하면 프로젝트 관리자에 접근할 수 있고, Godot를 이미 열어 둔 상태라면 (Ctrl + Shift + Q, macOS에서는 Ctrl + Option + Cmd + Q)을 클릭하세요.
프로젝트 관리자에서 버튼을 눌러 프로젝트를 가져오세요.
나타나는 팝업에서 압축을 푼 폴더로 이동하세요. project.godot 파일을 더블 클릭해 여세요.
마지막으로 버튼을 클릭하세요.
프로젝트가 마지막으로 더 오래된 Godot 버전에서 열렸다는 알림 창이 나타날 수 있습니다. 문제 없습니다. :button:`확인`을 눌러 프로젝트를 여세요.
프로젝트에는 두 개의 패킹된 씬이 있습니다. 공이 충돌하는 벽이 포함된 main.tscn 과 ball.tscn 입니다. 메인 씬이 자동으로 열려야 합니다. 메인 씬 대신 빈 3D 씬이 보이면 화면 상단의 2D 버튼을 클릭하세요.
Main 노드의 자식으로 볼을 추가해 보겠습니다. 씬 독에서 Main 노드를 선택한 다음, 씬 독 상단에 있는 링크 아이콘을 클릭하세요. 이 버튼을 사용하면 현재 선택된 노드의 자식으로 씬의 인스턴스를 추가할 수 있습니다.
볼 씬을 더블 클릭하여 인스턴스화하세요.
ball이 좌상단 구석의 뷰 포트에 나옵니다.
클릭한 후에 화면의 중앙으로 드래그하세요.
F5`(macOS에서는 :kbd:`Cmd + B)를 눌러 게임을 실행하세요. 공이 떨어지는 것이 보여야 합니다.
이제 Ball 노드의 인스턴스를 더 만들어 보겠습니다. 공이 계속 선택된 상태에서 Ctrl + D`(macOS에서는 :kbd:`Cmd + D)를 눌러 복제 명령을 실행하세요. 새 공을 다른 위치로 옮기려면 클릭한 채로 드래그하세요.
씬에 몇 개를 가지더라도 반복할 수 있습니다.
게임을 다시 실행하세요. 이제 각각의 볼이 서로 독립적으로 떨어지는 것을 볼 수 있을 것입니다. 이것이 인스턴스의 동작 방식입니다. 각 인스턴스는 템플릿 씬의 독립적인 복제품입니다.
씬과 인스턴스 편집하기
인스턴스에는 더 많은 기능이 있습니다. 이 기능을 사용하면 다음과 같은 작업을 수행할 수 있습니다:
다른 것에 영향을 주지 않고서도 Inspector를 사용해 ball 하나의 속성을 바꿉니다.
모든 Ball의 디폴트 속성을 변경하려면
ball.tscn씬을 열고 Ball 노드에서 변경사항을 수행하세요. 저장하면 프로젝트 안에 있는 모든 Ball의 인스턴스 값이 업데이트됩니다.
참고
인스턴스의 속성을 변경하면 해당 패킹된 씬의 값이 항상 오버라이드합니다.
이를 시도해 봅시다. 파일시스템에서 ball.tscn 을 더블 클릭하여 이를 여세요.
왼쪽에 씬 독에서 Ball 노드를 선택하세요. 그런 다음 오른쪽에 Inspector에서 PhysicsMaterial속성을 클릭하여 확장하세요.
바운스 속성을 0.5로 설정하기 위해 숫자 필드를 클릭하고, 0.5를 입력한 다음 Enter를 누르세요.
F5(macOS에서는 Cmd + B)를 눌러 게임을 실행하고 모든 볼이 이제 훨씬 더 많이 튀는 것을 확인하세요. 볼 씬은 모든 인스턴스의 템플릿이므로 수정하고 저장하면 모든 인스턴스가 해당 내용을 업데이트합니다.
개별 인스턴스를 조절해봅시다. 뷰 포트 위쪽에서 해당하는 탭을 클릭하면 메인 씬으로 돌아올 수 있습니다.
인스턴스화된 Ball 노드를 하나 선택하고, 인스펙터에서 중력 배수 값을 ``10``으로 설정합니다.
속성을 조절하고 나서, 회색 복구 버튼이 나타납니다.
이 아이콘은 씬에서 팩된 소스의 값을 오버라이드했다는 것을 알려줍니다. 원본 씬의 속성을 수정하더라도 인스턴스에 오버라이드된 값이 보존됩니다. 복구 아이콘을 누르면 저장된 씬에서 속성 값을 불러옵니다.
게임을 다시 실행하여 이 Ball이 다른 것보다 훨씬 빠르게 떨어지는지 봅시다.
참고
한 인스턴스의 물리 머티리얼 값을 변경하면 다른 모든 인스턴스에도 영향을 미칩니다. 이는 물리 머티리얼이 리소스이고 인스턴스 간에 리소스가 공유되기 때문입니다. 한 인스턴스에 대해 리소스를 고유하게 만들려면 Inspector에서 해당 리소스를 마우스 오른쪽 버튼으로 클릭하고 상황에 맞는 메뉴에서 유일하게 만들기를 클릭하세요.
리소스는 우리가 이후 강의에서 다룰 Godot 게임의 또 다른 필수 구성 요소입니다.
디자인 언어로서의 씬 인스턴스
Godot의 인스턴스와 씬은 뛰어난 디자인 언어를 제공하여 다른 엔진과 차별화됩니다. 우리는 처음부터 이 개념을 중심으로 Godot를 디자인했습니다.
Godot로 게임을 만들 때는 모델-뷰-컨트롤러(MVC)이나 엔터티-관계 다이어그램과 같은 아키텍처 코드 패턴은 잊어버리세요. 대신, 플레이어가 게임에서 보게 될 요소를 상상하고 이를 중심으로 코드를 구성하면 됩니다.
예를 들어 슈팅 게임을 다음과 같이 분류할 수 있습니다:
거의 모든 유형의 게임에 대해 이와 같은 다이어그램을 만들 수 있습니다. 각 사각형은 플레이어의 관점에서 게임에서 볼 수 있는 엔티티를 나타냅니다. 화살표는 어떤 씬이 어떤 씬을 소유하고 있는지 알려줍니다.
이렇게 다이어그램을 만들고 나서, 추천하는 게임 제작 과정은 다이어그램의 각 요소로 이루어진 씬을 만드는 것입니다. 코드 또는 편집기에서 직접 인스턴스화를 사용해서 소유권 관계를 만들게 됩니다.
게임을 (혹은 일반적으로 소프트웨어를) 프로그래밍할 때 가장 오래 걸리는 부분은 구조를 설계하고 게임의 컴포넌트를 그 구조에 알맞게 끼워 넣는 것입니다. 이 방법을 대체하기 위해 씬을 기반으로 설계하면 게임의 논리 자체에 집중하게 되어서, 개발을 좀 더 빠르고 직관적으로 만듭니다. 대부분의 게임 컴포넌트가 그대로 씬이 되기 때문에, 씬 인스턴스화를 기반으로 한 설계를 사용하는 것은 다른 구조적 코드가 필요하지 않게 되기 때문입니다.
많은 애셋과 중첩된 요소들로 이루어진 오픈월드 게임의 복잡한 예를 하나 더 살펴보겠습니다:
방을 만드는 것부터 시작했다고 상상해 보세요. 가구 배치 방법에 따라 여러 개의 방 씬을 만들 수 있습니다. 이후 방 인스턴스를 여러 개 사용해 집 씬을 만들 수 있습니다. 인스턴스화된 여러 집과 성채를 배치할 넓은 지형을 사용하면 성채도 만들 수 있습니다. 이들 각각은 하나 이상의 하위 씬을 인스턴스화하는 씬입니다.
나중에는 경호원 (그리고 다른 NPC)의 씬을 만들고 마찬가지로 성에 추가할 수 있습니다. 그 결과, 씬들은 게임 세상 전체에 간접적으로 추가됩니다.
Godot에서는 한 번 만든 씬을 더 많은 씬으로 인스턴스하는 방식으로 작업을 쉽게 반복할 수 있습니다. 게다가 편집기는 프로그래머에게도 비 프로그래머에게도 친근하게 설계되었습니다. 일반적인 팀 개발 과정에는 2D나 3D 아티스트, 레벨 디자이너, 게임 디자이너, 애니메이터가 있지만, 모두 편집기 인터페이스에서 작업합니다.
요약
청사진에서 객체를 생성하는 과정인 인스턴스화는 다양한 편의성을 제공합니다. 씬에서 제공되는 것 :
Bar와 Counter를 다시 사용할 수 있는 UI 컴포넌트로 바꾸기
복잡한 시스템을 구조화하고 캡슐화하는 도구.
게임 프로젝트의 구조를 자연스러운 방법으로 생각하기 위한 언어.