씬과 노드(Scenes and nodes)

소개

../../_images/chef.png

한번 당신이 더 이상 게임 개발자가 아니라고 상상해보세요. 이제 당신은 셰프입니다! 힙스터 복장을 벗어 던지고 토크와 더블 브레스트 재킷을 입는다고요. 이제 게임을 만드는 게 아니라, 손님을 위해 새롭고 맛있는 레시피를 만드는 것입니다.

그럼 어떻게 셰프가 레시피를 만들까요? 레시피는 두 가지 과정으로 나누어 집니다: 첫번째는 재료, 두번째는 요리하는 방법입니다. 이 과정으로 누구나 레시피를 따라서 훌륭한 음식을 맛 볼 수 있을 겁니다.

Godot에서 게임을 만드는 것도 꽤나 요리하는 느낌입니다. 엔진은 주방과 같습니다. 주방으로 친다면 노드(Node)는 요리를 하기 위해 신선한 재료들이 가득 찬 냉장고로 볼 수 있습니다.

많은 유형의 노드가 있습니다. 이미지를 보여주는 노드, 소리를 재생하는 노드, 3D 모델을 보여주는 노드 등이 있습니다. 그것도 수십 개나 있습니다.

노드(Node)

일단 기초로 한번 시작해봅시다. 노드는 게임을 만들기 위한 기초 건축 벽돌입니다. 앞서 말했듯이 노드는 다양한 특수 기능을 작업할 수 있습니다. 하지만 어떤 노드든지 항상 이러한 성질을 갖습니다:

  • 이름이 있습니다.
  • 편집할 수 있는 속성을 갖습니다.
  • 각 프레임을 처리하기 위한 콜백을 받을 수 있습니다.
  • (더 많은 기능을 갖기 위해) 확장될 수 있습니다.
  • 다른 노드의 자식으로 추가될 수 있습니다.
../../_images/tree.png

마지막이 중요합니다. 노드는 다른 노드를 자식으로 가질 수 있습니다. 이런 식으로 배열된다면 노드들은 트리(Tree)가 됩니다.

Godot에서 이런 방식으로 노드들을 배열하는 것은 프로젝트를 조직화하는데 강력한 도구가 됩니다. 각 노드들이 다른 기능을 가지고 있기에, 그들을 묶는 것으로 훨씬 복잡한 기능을 구현할 수 있습니다.

와닿지 않더라도 걱정하지 마세요. 앞으로 몇 몇 섹션에서 계속 노드에 대해 알아볼 것입니다. 여기서 기억할 점은 노드가 있고 이런 방식으로 서로 배열될 수 있는 점입니다.

씬(Scene)

../../_images/scene_tree_example.png

이제 노드의 개념이 정리되었으니, 다음 이론은 씬이 무엇인가에 대해 설명해 보겠습니다.

씬은 계층 구조로 (트리 형식으로) 조직된 노드 그룹으로 구성됩니다. 또한 씬은:

  • 항상 하나의 루트 노드를 갖습니다.
  • 디스크에 저장하고 다시 불러올 수 있습니다.
  • 인스턴스(Instance)될수 있습니다 (더 자세한 설명은 나중에).

게임을 실행한다는 것은 씬을 실행하는 것입니다. 한 프로젝트는 여러 씬으로 이루어지지만, 게임을 시작하면 그 중 하나의 씬만 메인 씬으로 선택됩니다.

기본적으로 Godot 편집기는 씬 편집기입니다. 사용자 인터페이스말고도 2D와 3D 씬을 편집하기 위한 도구가 많이 있지만, 편집기는 씬을 편집하는 것과 씬을 구성하는 노드들이란 개념으로 있습니다.

새 프로젝트 만들기

예제를 통해 이런 추상적인 개념들을 더 구체화해봅시다. 튜토리얼의 오랜 전통에 따라 "Hello World" 프로젝트를 시작하겠습니다. 이를 통해 편집기를 사용하는 법을 알게 될 것입니다.

프로젝트 외부에서 Godot 실행 파일을 실행하면, 프로젝트 매니저가 뜹니다. 개발자는 프로젝트 매니저로 프로젝트들을 관리할 수 있습니다.

../../_images/project_manager.png

새 프로젝트를 만들려면 "새 프로젝트(New Project)" 버튼을 클릭하세요. 프로젝트의 경로를 지정하고 프로젝트 이름을 지정하세요.

그리고 이 곳에서 렌더링 백엔드를 선택할 수도 있습니다 (OpenGL ES 3.0 또는 OpenGL ES 2.0). 각자 장단점이 있고 선택하는데 도움이 될 것입니다. 그리고 더 자세한 정보는 Differences between GLES2 and GLES3을 참고해 볼 수 있습니다. 나중에 마음이 바뀌면 프로젝트 설정(Project Settings)에서 백엔드를 바꿀 수 있습니다. 이 튜토리얼에서는 양 쪽 다 괜찮습니다.

../../_images/create_new_project.png

편집기

"Nee Project"를 만들고 프로젝트를 엽니다. 그러면 Godot 편집기가 열립니다:

../../_images/empty_editor.png

앞서 말했듯이, Godot로 게임을 만드는 것은 주방에 있는 것과 같은 느낌입니다. 그렇다면 한번 냉장고를 열고 프로젝트에 신선한 노드들을 추가해 봅시다. 실행을 누르면 "Hello World!"가 화면에 나오게 할 것입니다.

작업을 하려면 Label 노드를 추가해야 합니다. 씬 독의 왼쪽 위에 있는 "자식 노드 추가하기(Add Child Node" 버튼을 클릭하세요 (더하기 아이콘처럼 생겼습니다). 이 버튼은 씬에 새 노드를 추가하는 기본 방법입니다. 그리고 자식을 추가하면 항상 현재 선택된 노드의 자식으로 노드가 추가됩니다 (비어있는 씬의 경우 노드는 "루트" 노드로 추가됩니다).

주석

(루트 노드가 없는) 비어있는 씬에서, 씬 독은 씬에 루트 노드를 빠르게 추가하는 여러 설정을 보여줍니다. "2D 씬(2D Scene)"은 Node2D 노드를, "3D 씬(3D Scene)"은 Spatial 노드를, "사용자 인터페이스(User Interface)"는 Control 노드를 추가합니다. 그리고 "맞춤 노드(Custom Node)"는 선택한 아무 노드든지 추가합니다 (즉, "자식 노드 추가하가(Add Child Node)" 버튼을 누른 것과 같습니다). 또한 자주 쓰는 노드를 창에 표시하려면 별 모양 아이콘을 누르면 됩니다.

이 프리셋은 편의를 위해 있는 것이지 다른 유형의 씬에서까지 필수적인 것은 아닙니다. 모든 3D 씬의 루트 노드가 Spatial 노드인 것이 아닙니다. 마찬가지로 모든 GUI나 2D 씬의 루트 노드가 Control 노드나 Node2D 노드인 것이 아닙니다.

그러면 이 씬에 Label 노드를 추가하려면 맞춤 노드(Custom Node)를 클릭하거나 위의 노드 추가하기(Add Node) 버튼을 클릭하세요. 비어있는 씬이 아니라면 노드 추가하기 버튼으로 선택한 노드의 자식 노드를 추가할 수 있습니다.

../../_images/newnode_button.png

그러면 노드 만들기(Create Node) 대화 상자가 열립니다. 만들 수 있는 노드가 길게 나열되어 있죠:

../../_images/node_classes.png

거기서 "Label" 노드를 먼저 선택하세요. 검색이 가장 빠른 방법일 것입니다:

../../_images/node_search_label.png

마지막으로 Label을 만드세요! 만들기(Create) 버튼을 누르는 순간 많은 일이 일어납니다:

../../_images/editor_with_label.png

먼저 (Label이 2D 노드 유형이기 때문에) 씬이 2D 편집기로 바뀝니다. 그리고 Label은 선택한 상태로 뷰포트의 왼쪽 위에 나타납니다.

노드는 씬 트리 편집기에 나타납니다 (오른쪽 위 상자), 그리고 Label 속성은 인스펙터(Inspector)에 나타납니다 (오른쪽 아래 상자).

다음 단계는 Label의 "Text" 속성을 바꾸는 것입니다. Text 속성에 "Hello World!"를 입력해봅시다:

../../_images/hw.png

좋아요. 씬을 실행할 준비가 됐습니다! 상단 메뉴에서 버튼 중 씬 실행(PLAY SCENE) 버튼을 누르세요 (혹은 F6 키를 누르세요):

../../_images/playscene.png

그러며언... 어이쿠.

../../_images/neversaved.png

씬을 실행하려면 저장을 해야 합니다. 따라서 씬(Scene) -> 저장하기(Save)로 가서 Hello.tscn같은 이름을 짓고 씬을 저장하세요:

../../_images/save_scene.png

그러면 재미난 일이 일어납니다. 파일 대화 상자는 특별하기 때문에, 프로젝트 안에만 저장할 수 있습니다. 프로젝트의 루트는 "res://"로 "리소스 경로(resource path)"를 의미합니다. 즉, 파일은 프로젝트 안에만 저장할 수 있다는 것입니다. 나중에 Godot에서 파일을 관리할 때 "res://"가 리소스 경로라는 사실을 기억하세요. 이것만 안다면 플랫폼의 종류나 설치 경로와 관계없이 게임 내에서 리소스 파일을 찾을 수 있습니다.

씬을 저장하고 씬을 다시 실행하면, 마침내 "Hello World" 데모가 실행될 것입니다:

../../_images/helloworld.png

성공!

주석

데모가 즉시 작동하지 않을 수 있습니다. 모니터 중 하나가 hiDPI 화면으로 설정한 경우, 프로젝트(Project) → 프로젝트 설정(Project Settings) → Display → Window로 가세요. 그런 다음 Dpi 아래에 있는 Allow Hidpi 설정을 켜세요.

프로젝트 설정하기

좋아요. 프로젝트를 설정할 시간입니다. 지금 할 수 있는 일은 현재 씬을 실행하는 것 뿐입니다. 하지만 프로젝트는 여러 개의 씬을 갖기 때문에, 어느 한 씬을 메인 씬으로 설정해야 합니다. 프로젝트를 실행하면 언제나 불러오는 씬이죠.

이 설정은 모두 project.godot 파일에 저장됩니다. (편집을 쉽게 할 수 있도록) win.ini 형식으로 된 텍스트 파일입니다. 이 파일에는 프로젝트를 실행하는 방법을 바꾸는 수 십 개의 설정이 있습니다. Godot는 이 과정을 간소화하기 위해 project.godot 파일을 편집하는 프로젝트 설정(Project Settings) 대화 상자를 제공합니다.

대화 상자에 접근하려면 프로젝트(Project) -> 프로젝트 설정(Project Settings)을 선택하세요. 지금 해보세요.

창을 열었다면 메인 씬을 선택합시다. 'Application/Run/Main Scene' 속성으로 가서 'hello.tscn'을 선택하세요.

../../_images/main_scene.png

이렇게 바꾸면 이제 어떤 씬을 편집하는 중이든 간에, 기본 실행(Play) 버튼을 누르면 (혹은 F5 키를 누르면) 설정한 씬이 실행됩니다.

프로젝트 설정 대화 상자는 많은 설정을 제공합니다. 설정은 project.godot 파일에 저장하거나 기본 값으로 되돌릴 수 있습니다. 값을 바꾸면 이름 왼쪽에 체크 표시가 뜹니다. 이는 값을 바꾼 속성이 project.godot 파일에 저장되었다는 뜻입니다.

여담으로 ProjectSettings 싱글톤(Singleton)을 사용해서 맞춤 설정을 추가, 이를 런타임 도중 읽게 만들 수도 있습니다.

계속...

이 튜토리얼은 "씬과 노드"에 대해서 설명했습니다. 그런데 지금까지는 단 하나의 씬과 하나의 노드만 설명했습니다! 걱정하지 마세요. 다음 튜토리얼로 가서 개념을 넓혀봅시다...