본문 바로가기
Programming/Godot

Godot 엔진 시작하기 - 인스턴스 생성

by Wilkyway 2022. 1. 12.
반응형

요약

인스턴싱은 편리함이 많습니다. 

  • 장면을 세분화하고 관리하기 쉽게 만드는 기능.
  • 여러 노드 인스턴스를 한 번에 관리하고 편집하는 기능.
  • 복잡한 게임 흐름 또는 UI를 나누어 구성하고 포함하는 기능. (Godot에서 UI 요소도 노드(장면)임).

 

소개

Scene & Node 에서 씬은 하나의 루트 노드에서 시작되는 트리 구조의 노드 모음임을 배웠습니다.


원하는 만큼 장면을 만들어 디스크에 저장할 수 있습니다. 이러한 방식으로 저장된 장면을 "Packed Scene"이라고 하며 .tscn 확장자의 파일로 저장됩니다.

씬이 저장되면 다른 씬에서 노드처럼 인스턴싱 할 수 있습니다.

위 그림에서 Scene B는 Scene A에 인스턴스로 추가되었습니다.

인스턴싱 예시

샘플 프로젝트: instancing.zip. .

적당한 곳에 압축을 풀고 프로젝트 매니저에서 '가져오기(Import)' 버튼을 사용하여 프로젝트를 추가합니다.

압축을 푼 폴더의 "project.godot" 파일을 열면 새 프로젝트가 프로젝트 목록에 나타납니다. '편집' 버튼을 눌러 프로젝트를 편집합니다.

이 프로젝트에는 "Ball.tscn" 및 "Main.tscn"의 두 씬이 포함되어 있습니다. Ball 씬은 RigidBody2D 를 사용하여 물리적 동작을 제공하고, Main 씬은 Ball이 충돌할 장애물 세트로 되어 있습니다( StaticBody2D 사용 ).

 

Main씬을 열고 Main루트 노드를 선택합니다.

Ball씬의 인스턴스를 Main씬의 자식으로 추가하려고 합니다. "링크" 모양의 버튼(호버 텍스트에 "씬 파일을 노드로 인스턴스화"라고 표시됨)을 클릭하고 Ball.tscn파일을 선택합니다.

공은 화면 영역의 왼쪽 상단 모서리에 배치됩니다( 화면 (0, 0)좌표에 있음). 편집창의 상단 중앙 근처로 공을 드래그합니다.

"재생"을 누르고 공이 화면 하단으로 떨어지는 것을 확인합니다.

Multi Instance

"인스턴스" 버튼을 다시 사용하거나 공 인스턴스를 클릭하고 Ctrl + D( macOS의 경우 Cmd + D) 키를 눌러 인스턴스를 복제 하여 원하는 만큼 넉넉히 인스턴스를 장면에 추가합니다.

장면을 다시 실행하면 모든 공이 떨어집니다.

인스턴스 편집

Ball씬을 열고 PhysicsMaterial클릭하여 확장하고 Bounce속성을 1로 설정합니다.

"재생"을 누르면 인스턴싱된 모든 Ball이 더 탄력 있는 모습이 확인될 것입니다. 인스턴싱된 Ball은 Packed Scene을 기반으로 하기 때문에 해당 장면에 대한 변경 사항은 모든 인스턴스에 영향을 미칩니다.

개별 인스턴스를 조정할 수도 있습니다. 바운스 값을 다시 0 으로 설정한 다음 Main씬에서 Ball 인스턴스중 하나를 선택합니다. PhysicsMaterial 같은 리소스는 기본적으로 인스턴스 간에 공유되므로 고유하게 만들어야 합니다. Inspector 독의 오른쪽 상단에 있는 도구 버튼을 클릭하고 "하위 리소스를 고유하게 만들기"를 선택하십시오.  Bounce 1로 설정하고 "재생"을 누릅니다.

조정된 속성 옆에 회색 "되돌리기" 버튼이 나타납니다. 이 버튼이 있으면 Packed Scene에서 해당 값을 재정의하도록 인스턴싱된 씬의 속성을 수정했음을 의미합니다. 해당 속성이 원본 장면에서 수정되더라도 사용자 정의 값은 유지됩니다. 되돌리기 버튼을 누르면 속성이 Packed Scene의 값으로 복원됩니다.

 

디자인 언어

그러나 씬 인스턴싱 방식의 가장 큰 장점은 뛰어난 디자인 언어로 작동한다는 것입니다. 이것은 Godot를 다른 모든 엔진과 구별하는 특징으로 Godot엔진은 처음부터 이러한 개념으로 설계되었습니다.

Godot로 게임을 만들 때 권장되는 접근 방식은 MVC 또는 Entity-Relationship 다이어그램과 같은 가장 일반적인 디자인 패턴 대신 더 자연스러운 방식으로 장면에 대해 생각하는 것입니다. 프로그래머뿐만 아니라 누구나 생각할 수 있는, 눈에보이는 게임의 요소를 상상하는 것부터 시작합니다.

예를 들어 간단한 슈팅 게임을 다음과 같이 상상해보겠습니다.

거의 모든 종류의 게임에 대해 이와 같은 다이어그램을 만들 수 있습니다. 게임에서 시각화할 수 있는 부분을 기준으로 다이어그램을 만들고, 화살표를 추가하여 구성 요소간의 소유(상위) 개념을 표시합니다.

이러한 다이어그램을 작성한 후에는, 다이어그램의 각 요소에 대해 장면(씬)을 만드는 방식으로 작업하는 것을 추천합니다. 소유권 관계에 대해 인스턴싱(코드로 또는 편집기에서 직접 추가 가능)을 사용합니다.

게임(또는 일반적인 소프트웨어)을 프로그래밍하는 데 사실은 굉장히 많은 시간이 아키텍처를 설계하고, 해당 아키텍처에 게임 구성 요소를 맞추는 데 소요됩니다. 장면(씬)을 기반으로 하는 디자인은 이러한 접근 방식을 대체하고 개발을 훨씬 빠르고 간단하게 만들어 게임 로직 자체에 집중할 수 있도록 합니다. Godot엔진에서는 게임 구성 요소가 장면(씬)과 동일하게 매핑되기 때문에, 장면 인스턴싱을 기반으로 하는 디자인을 사용하면 그 외의 추가적인 아키텍처 코드가 거의 필요하지 않습니다.

많은 자산과 중첩 요소가 있는 오픈 월드 게임 유형의 좀 더 복잡한 예를 하나 더 살펴보겠습니다.

Room 요소(씬) 에서 시작했다고 가정해 보겠습니다. 우리는 서로 다른 가구(씬)를 배치(인스턴싱)하여 다른 Room장면(씬)을 만들 수 있습니다. 여러 Room장면(씬)을 연결하여 내부를 구성하는 House장면(씬)을 만들 수 있습니다.

그런 다음 많은 House장면(씬)으로 인스턴싱된 Citadel장면(씬)을 만들 수 있습니다. 그런 다음, 세계 지도 Terrain에 대한 작업을 시작하여 그 위에 Citadel를 추가할 수 있습니다.

나중에 경비원(및 다른 NPC)을 나타내는 장면(씬)을 만들고 Citadel에도 추가할 수 있습니다. 결과적으로 전체 게임 세계에 간접적으로 추가됩니다.

Godot엔진을 사용하면 더 많은 장면(씬)을 만들고 인스턴싱하기만 하면 되므로 이와 같이 게임 요소를 쉽게 반복 제작할 수 있습니다. 또한 편집기 UI는 프로그래머와 비프로그래머 모두에게 사용자 친화적으로 설계되었습니다. 일반적인 팀 개발 과정에는 2D 또는 3D 아티스트, 레벨 디자이너, 게임 디자이너 및 애니메이터 등이 있는데 모두 단일 편집기 인터페이스로 작업할 수 있습니다.

 

반응형

댓글