본문 바로가기

레퍼런스/고도엔진

고도엔진 튜토리얼 #1 씬들과 노드들 (Scenes and nodes)

도입


../../_images/chef.png

잠시 여러분이 게임 개발자가 아니라고 상상해보세요. 대신, 여러분은 쉐프입니다! 힙스터 패션은 집어던지고 쉐프 차림을 해보세요. 지금부터, 게임을 만드는 것 대신에 여러분은 손님을 위해 새롭고 맛있는 레시피를 개발하는 겁니다.


그렇다면, 쉐프는 어떻게 레시피를 만들까요? 레시피는 두가지 부분으로 나뉩니다: 첫번째는 재료이고 두번째는 음식을 준비하기 위한 지시 혹은 단계들입니다. 이렇게 하면 누구나 레시피를 따라 할 수 있고 여러분의 훌륭한 창조물을 맛 볼 수 있습니다.


고도엔진으로 게임을 만드는 것은 위와 같은 방법과 비스무레합니다. 엔진을 사용하는 것은 주방에 있는 것과 같은 느낌입니다. 이 주방에서는, 노드들이 요리할 신선한 재료로 꽉 찬 냉장고와 같습니다.


다양한 유형의 노드가 있고, 일부는 이미지를 보여주고, 일부는 소리를 재생하고, 다른 일부는 3D 모델을 보여주는 등 수십개의 노드가 존재합니다.



노드


기초부터 시작합시다. 노드는 게임을 개발하기 위한 기본 요소입니다. 아래와 같은 특징을 가집니다 : 


  • 이름을 가지고 있구요.
  • 바꿀 수 있는 속성을 가지고 있습니다.
  • 모든 프레임을 처리하기 위해서 콜백으로 처리할 수 있습니다.
  • 확장 가능 (추가 기능 포함_
  • 다른 노드에 자식으로 추가될 수 있습니다.
../../_images/tree.png
마지막 것이 가장 중요합니다. 노드는 다른 노드를 자식으로 가질 수 있습니다. 이런 식으로 배열하게 되면 노드는 트리 형태를 갖추게 됩니다. 위의 그림처럼 말이죠!

고도엔진에서, 이러한 방식으로 노드를 배열하는 기능은 프로젝트를 구성하기 위한 강력한 도구를 만듭니다. 서로 다른 노드는 서로 다른 기능을 가지기 때문에 노드들을 결합하면 더 복잡한 기능들을 만들 수 있습니다.

아직 명확하지 않고 말이 안 되는 부분이 있을 수도 있지만, 모든 것들이 앞으로 몇가지 섹션을 거치며 갑자기 이해될(click) 것입니다. 현재 기억해야 할 가장 중요한 사실은 노드가 존재하며 이러한 방식으로 배열될 수 있다는 점입니다.



../../_images/scene_tree_example.png

이제 노드의 개념이 정의되었으므로, 논리적으로 다음 단계는 씬(장면)이 무엇인지 설명하는 것입니다.


장면은 계층적으로(트리 형식으로) 구성된 노드 그룹으로 구성됩니다. 다음과 같은 속성이 있습니다.


  • 씬은 항상 하나의 루트 노드를 가집니다.
  • 씬은 디스크에 저장하고 다시 로드할 수 있습니다.
  • 씬을 인스턴스화할 수 있습니다.
  • 게임을 한다는 것은 씬을 실행하는 것을 의미합니다.
  • 프로젝트에는 여러 장면이 포함될 수 있지만 프로젝트를 시작하려면 먼저 이러한 장면 중 하나를 로드하도록 선택해야 합니다.

기본적으로 고도 에디터는 장면 에디터입니다. 2D 및 3D 장면을 편집할 수 있는 도구와 사용자 인터페이스가 많이 있지만, 편집기는 장면을 편집하는 개념과 장면을 구성하는 노드를 기반으로 합니다.



새로운 프로젝트 만들기


이론은 지루하죠, 직접 실행에 옮겨봅시다! 튜토리얼의 오랜 전통에 따라 첫번째 프로젝트는 Hello World가 될 것입니다. 이를 위해 에디터를 사용합시다.


../../_images/project_manager.png

새 프로젝트를 생성하려면 "새 프로젝트" 옵션을 사용해야 합니다. 프로젝트 경로를 선택하고 생성한 다음 프로젝트 이름을 지정하세요.



../../_images/create_new_project.png


에디터


일단 "새 프로젝트"가 생성되면, 다음 단계는 프로젝트를 여는 것입니다. 이렇게 하면 고도 에디터가 실행됩니다. 에디터를 새로 열었을 때의 모양입니다 :


../../_images/empty_editor.png

앞서 언급했듯이, 고도에서 게임을 만드는 것은 주방에 있는 것과 같습니다. 그러니 냉장고를 열어 펄떡거리는 신선한 노드들을 프로젝트에 추가해봅시다. Hello World와 함께 시작하게 됩니다. 그러기 위해서 "New Node" 버튼을 눌러야 합니다(씬 탭 아래에 더하기 기호가 있습니다.):


../../_images/newnode_button.png

그러면 Create Node(노드 생성) 대화 상자가 열리고, 생성할 수 있는 노드의 긴 목록이 표시됩니다.


../../_images/node_classes.png

여기서 먼저 "Label" 노드를 선택하세요. 이는 "Control" 노드에 있지만, 검색하는 것이 가장 빠른 방법일 것입니다.


../../_images/node_search_label.png

그리고 마지막으로, 라벨을 만들어 보세요! Create(생성)을 누르면 다음과 같은 작업이 많이 수행됩니다 :


../../_images/editor_with_label.png

우선, 장면이 2D 에디터로 변경되고 (왜냐하면 라벨은 2D 노드 타입이기 때문), 뷰포트의 왼쪽 위 모서리에 Label(라벨)이 나타납니다.


노드는 씬(scene) 트리 편집기에 나타나고(왼쪽 위 모서리에 있는 상자) 레이블 속성은 인스펙터에 나타납니다(오른쪽에 있는 상자).


다음 단계에서는 라벨의 "텍스트" 속성을 변경합니다. 이 속성은 "Hello, World!"로 변경하겠습니다,


../../_images/hw.png

좋아요, 씬을 실행할 준비가 되었습니다! 상단 표시줄에 있는 PLAY SCENE 버튼을 누르거나 F6을 누릅니다.


../../_images/playscene.png

아... 어라


../../_images/neversaved.png

씬을 실행하려면 장면을 저장해야 하므로 씬을 hello.scn 처럼 저장해줍니다. Scene -> Save로 저장합니다.


../../_images/save_scene.png

그러면 재미있는 일이 일어납니다. 파일 대화 상자는 특수한 파일 대화 상자로, 프로젝트 내에서만 저장할 수 있습니다. 프로젝트 루트는 "res://"이며 이는 "리소스 경로"를 뜻합니다. 이는 파일을 프로젝트 내에서만 저장할 수 있다는 것을 의미합니다. 미래를 위해 고도에서 파일 작업을 할 때는 "res://"가 리소스 경로이며 플랫폼이나 설치 위치에 관계 없이 이는 게임 내에서 리소스 파일의 위치를 찾는 방법이라는 점을 기억하세요.


씬을 저장하고 run scene을 다시 누르면 "Hello, World!" 데모가 마침내 실행됩니다.


../../_images/helloworld.png

성공입니다!



프로젝트의 구성


좋아요, 이제 그 프로젝트에 대해 몇가지 계획을 세울 때에요. 지금 당장 뭔가를 할 수 있는 유일한 방법은 현재 씬을 실행하는 것입니다. 그러나 프로젝트에는 여러 장면이 있으므로 그 중 하나를 기본 씬으로 설정해야 합니다. 이 씬은 프로젝트가 실행될 때 로드되는 씬입니다.


이 설정들은 모두 win.ini 형식의 일반 텍스트 파일인 engine.efg 파일에 저장되어 쉽게 편집할 수 있습니다. 이 파일에는 프로젝트 실행 방식을 변경하기 위해 변경할 수 있는 수십개의 설정이 있으므로 문제를 더 간단하게 만들기 위해 프로젝트 설정 대화 상자가 존재합니다. 이는 engine.cfg의 일종입니다.


해당 대화 상자에 접근하려면, Scene -> Project Settings로 이동합니다.


창이 열리면 주요 씬을 선택하는 것이 과제가 됩니다. 이는 application/main_scene 속성을 변경하고 'hello.scn'을 선택하면 쉽게 수행할 수 있습니다.


../../_images/main_scene.png

이 변경 사항으로 인해 어떤 씬을 편집하고 있든지 간에 일반 재생 버튼(F5)을 누르면 프로젝트가 실행됩니다.


프로젝트 설정 대화 상자로 돌아갑니다. 이 대화 상자는 engine.cfg에 추가할 수 있는 여러가지 옵션을 제공하며 기본 값을 보여줍니다. 기본값이 ok이면, 값을 변경할 필요가 없습니다.

값이 변경되면 이름 왼쪽에 체크 표시가 뜹니다. 이는 속성이 engine.cfg 파일에 저장되고 기억됨을 의미합니다.


참고로, 향후 참조와 맥락을 벗어난 내용의 경우 (이것은 어쨌든 첫 번째 튜토리얼입니다!), Globals singleton을 이용해 런타임(run-time)에 커스텀 설정 옵션에 추가하고 읽을 수도 있습니다.



To be continued...


이 튜토리얼에서는 "scenes and nodes"에 대해서 설명하지만 지금까지는 하나의 씬과 하나의 노드만 있었습니다. 하지만 걱정마세요! 다음 튜토리얼은 그 주제를 다룰 겁니다.