반응형

요약

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

  • 장면을 세분화하고 관리하기 쉽게 만드는 기능.
  • 여러 노드 인스턴스를 한 번에 관리하고 편집하는 기능.
  • 복잡한 게임 흐름 또는 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 아티스트, 레벨 디자이너, 게임 디자이너 및 애니메이터 등이 있는데 모두 단일 편집기 인터페이스로 작업할 수 있습니다.

 

반응형
반응형

Node(노드)

노드는 게임 구축의 기본 블록입니다. 이미지를 표시하고, 사운드를 재생하고, 카메라 뷰를 표현하는 등 수행할 수 있는 기능에 따라 수십가지 종류가 있습니다.

모든 노드에는 다음 속성이 있습니다.

  • 이름.
  • 편집 가능한 속성.
  • 매 프레임마다 업데이트될 콜백함수
  • 새로운 속성과 기능으로 확장
  • 다른 노드에 자식으로 추가

마지막 속성이 키포인트입니다. 여러 다른 기능의 노드를 결합하면 더 복잡한 동작을 하는 노드가 생성됩니다. 이전에 보았듯이 "Character" 노드는 KenematicBody2D 노드, Sprite2D 노드, Camera2D 노드 및 CollisionShape2D 노드를 사용하여 카메라가 따라가며 뷰가 전환되는 캐릭터를 만들 수 있었습니다.

Scene(장면)

캐릭터 씬과 같이 하나의 씬이 저장되면 해당 씬은 편집기에서 새로운 노드처럼 작동하며, 다른 노드의 자식으로 추가할 수 있습니다. 이 경우 씬은 '인스턴싱되었다'고 하며, 해당 인스턴스의는 내부 노드는 숨겨진 단일 노드로 나타납니다.

씬에서 게임 코드를 작성할 수 있습니다. 캐릭터의 라이프 바(게이지), 달리기, 점프 등의 기능을 스크립트로 작성할 수 있습니다.

Godot 편집기는 본질적으로 씬 편집기 입니다. 2D 및 3D 씬편집과 사용자 인터페이스씬 구축을 위한 많은 도구가 있습니다. Godot 프로젝트는 이러한 씬을 사용자가 원하는 만큼 얼마든지 포함할 수 있습니다. Godot 게임이 실행되기 위해서는 메인씬(main scene) 하나가 필요합니다. 메인씬은 게임이 실행될 때 처음 로드하는 씬입니다.

그 외에도 씬에는 다음과 같은 속성이 있습니다.

  1. 항상 하나의 루트 노드 존재.
  2. 하드 드라이브에 저장하고, 로드가능.
  3. 씬의 인스턴스를 원하는 만큼 생성 가능. 즉, 캐릭터 씬 하나를 이용하여 새로운 캐릭터를 얼마든지 복제/생성할 수 있습니다.

씬 만들기

장면을 만들어 보겠습니다. 새 프로젝트를 생성합니다. 프로젝트를 열면 빈 편집기가 표시됩니다.

빈 장면에서 왼쪽의 장면 독에는 루트 노드를 빠르게 추가할 수 있는 몇 가지 옵션이 표시됩니다. "2D Scene"은 Node2D 노드를 추가하고, "3D Scene"은 Spatial 노드를 추가하고, "사용자 인터페이스"는 Control 노드를 추가하고, "Other Node"를 선택하면 노드 전체 리스트 화면이 나타나고 원하는 노드를 선택할 수 있습니다.   "자식 노드 추가"(+) 버튼을 선택하는 방법도 있습니다.

씬에 Label노드 하나를 추가하겠습니다. Label노드의 기능은 화면에 텍스트 그리기입니다.

장면 독의 왼쪽 상단에 있는 "자식 노드 추가" 버튼을 눌러 노드를 만듭니다. 아무런 노드가 없는 상태에서 이 버튼을 클릭하면 루트 노드를 생성하고, 여러 노드가 있을 때에는 선택된 노드의 자식으로 노드를 추가합니다.

대화상자가 열리면 사용 가능한 노드 리스트가 나열되고, 이중에서 필요한 노드를 선택할 수 있습니다.

Label 노드를 선택합니다. 검색창에 이름을 타이핑하여 필터링이 가능합니다.

Label 노드를 클릭하여 선택하고 창 하단에 있는 Create 버튼을 클릭합니다.

Label노드는 2D 노드 유형이기 때문에 Scene이 2D 작업 공간으로 변경됩니다. Label이 뷰포트(편집창)의 놔측 상단에 선택된 상태로 나타납니다. 그리고 왼쪽의 Scene 도크에 노드가 표시되고, 노드의 세부 속성은 오른쪽의 Inspector 도크에 나타납니다.

노드 속성 변경

화면에 표시되는 텍스트를 변경해 보겠습니다. 우리가 입력할 텍스트는 "Hello World"입니다.

뷰포트 오른쪽에 있는 Inspector 도크로 이동하여 Text 속성 아래의 필드 내부를 클릭하고 "Hello World"를 입력합니다.

입력할 때 뷰포트에 텍스트가 그려지는 것을 볼 수 있습니다.

도구 모음에서 이동 도구를 선택하여 뷰포트의 레이블 노드를 이동할 수 있습니다.

레이블을 선택한 상태에서 뷰포트의 아무 곳이나 클릭하고 끌어 직사각형으로 구분된 뷰의 중앙으로 이동합니다.

씬 실행

씬을 실행할 준비가 되었습니다. 화면 우측 상단의 Play Scene 버튼을 클릭합니다. (단축키 F6)

실행에 필요한 씬을 저장하라는 팝업이 나타납니다.

Yes 버튼을 클릭하면 나타나는 파일 브라우저에서 저장 버튼을 눌러 "Label.tscn"으로 저장합니다.

 

응용 프로그램이 새 창에서 열리고 "Hello World" 텍스트가 표시됩니다.

정상적으로 확인되었으면 실행 중인 씬을 종료합니다.(단축키 F8)

 

씬 주요 설정

씬을 실행하기 위해 Play Scene 버튼을 사용했습니다. 옆에 있는 또 다른 버튼을 사용하면 프로젝트의 메인씬을 설정하고 실행할 수 있습니다. (단축키 F5)

팝업 창이 나타나고 메인 장면을 선택하도록 안내문구가 나타납니다.

선택 버튼을 클릭하고 나타나는 파일 대화 상자에서 Label.tscn을 두 번 클릭합니다.

씬이 다시 실행됩니다. 앞으로 이 프로젝트를 실행할 때마다 Godot는 지금 지정한 Label.tscn 씬을 시작점으로 사용하게 됩니다.

 

참고 : Main Scene 지정 방법

1. "Project -> Project Settings" 에서 설정 변경.

2. project.godot 파일에서 직접 텍스트 편집.

반응형
반응형

 

[Godot 엔진 다운로드]

프로젝트 매니저

Godot를 실행하면 가장 먼저 보게 될 창은 프로젝트 매니저입니다. 최초 실행시에는 프로젝트가 없으므로 애셋 라이브러리를 열 것인지 묻는 팝업이 표시됩니다. 우선 취소하고 신규 프로젝트 생성을 하겠습니다.

이제 프로젝트 관리자가 표시되면 게임 프로젝트를 생성, 제거, 가져오기 또는 시작(열기)할 수 있습니다.

오른쪽 상단에는 편집자의 언어를 변경할 수 있는 드롭다운 메뉴가 있습니다.

애셋 라이브러리 프로젝트 탭에서 오픈 소스 프로젝트 템플릿과 데모를 다운로드하여 빠른 시작을 할 수 있습니다. 원하는 템플릿이나 데모를 선택하여 다운로드가 완료되면 설치를 클릭하고 프로젝트 경로를 선택하면 됩니다. 

프로젝트 생성 또는 가져오기

새 프로젝트를 생성하려면 오른쪽에 있는 새 프로젝트(New Project)버튼을 클릭합니다. 이제 이름을 지정하고 저장할 빈폴더를 선택한 다음 렌더러를 선택합니다.

탐색(Browse) 버튼을 클릭하여 Godot의 파일 브라우저를 열고 위치를 선택 또는 입력합니다.

오른쪽에 녹색 체크 표시가 보이면 엔진이 빈 폴더를 감지했음을 의미합니다.  프로젝트 이름 옆에 있는 Create Folder버튼을 클릭하면 해당 프로젝트 이름으로 빈 폴더가 생성됩니다.

마지막으로 사용할 렌더러(OpenGL ES 3.0 또는 OpenGL ES 2.0)를 선택해야 합니다. 

 

완료되면 Create & Edit을(를) 클릭 합니다. 프로젝트를 생성하고 에디터가 열리게 됩니다. 기존 프로젝트가 있을 경우 프로젝트를 선택(더블 클릭)하면 해당 프로젝트 편집창이 열립니다.

가져오기 버튼을 사용하여 유사한 방식으로 기존 프로젝트를 가져올 수 있습니다. 

폴더 경로가 정확하면 녹색 확인 표시가 나타납니다.

편집기

최초 편집기가 열리면 3D모드의 편집창과 각종 메뉴들이 보입니다.

상단에는 왼쪽에서 오른쪽으로 메인 메뉴 , Workspaces , 플레이 테스트 버튼 이 있습니다.

FileSystem dock 은 프로젝트 파일과 Asset을 관리하는 곳입니다 .

Scene Dock  활성 장면의 콘텐츠를 나열하고 Inspector 를 통해 장면 콘텐츠의 속성을 관리할 수 있습니다.

중앙 상단에 도구 모음(Toolbar) 이 있으며, 여기에 개체를 이동, 크기 조정 또는 잠그는 도구가 있습니다. 다른 작업 공간으로 이동하면 메뉴 리스트는 변경됩니다.

하단 패널에는 디버그 콘솔, 애니메이션 편집기, 오디오 믹서가 위치합니다. 타입테이블 작업을 주로 하기 때문에 넓은 공간에 위치하고 있고, 각각의 기능은 탭으로 전환하도록 설계되었습니다.

Workspace

상단에 2D, 3D, Script 및 AssetLib의 4가지 작업 공간 버튼이 있습니다.

2D 작업 공간은 모든 유형의 게임에서 사용됩니다. 2D 게임편집 외에도 인터페이스를 구축하는 용도로 사용됩니다. 단축키 Ctrl + F1(macOS에서 Alt + 1)로 접근할 수 있습니다.

3D 작업 공간에서는 3D 게임의 메쉬, 조명 및 디자인 작업을 할 수 있습니다. 단축키 Ctrl + F2(macOS에서 Alt + 2)로 접근할 수 있습니다.

도구 모음 아래에 있는 투시 버튼은 3D 뷰포트와 관련된 옵션 목록을 엽니다.

 

Script

코드 편집창입니다. 코드 편집기에는 디버거, 자동 완성, 코드 참조가 내장되어 있습니다. 단축키 Ctrl + F3(macOS에서 Alt + 3)로 접근할 수 있습니다.

스크립트를 작성하는 동안 엔진의 클래스, 메서드, 속성, 상수 또는 신호에 대한 정보를 검색하려면 스크립트 작업 공간의 오른쪽 상단에 있는 "도움말 검색"(Search Help) 버튼을 누릅니다.

새 창이 나타납니다. 정보를 찾고자 하는 항목을 검색합니다.

찾는 항목을 클릭하고 열기를 누릅니다. 항목에 대한 설명문서가 작업 공간에 표시됩니다.

마지막으로 AssetLib 에서는 프로젝트에서 사용할 수 있는 Add-on, Script, Asset Library등을 찾아 설치할 수 있습니다.

인터페이스 수정

Godot의 인터페이스는 단일창입니다. 일반적인 개발툴(Atom 또는 Visual Studio Code)처럼 여러 화면으로 분할하여 작업하는 것은 불가능합니다. 단순한 패널 이동이나 수평/수직 사이즈 조절은 가능합니다.

 

독 또는 패널의 가장자리를 클릭하고 끌어 수평 또는 수직으로 크기를 조정합니다.

도크 상단에 있는 점 3개 아이콘을 클릭하여 위치를 변경합니다.

Editor Settings > Editor메뉴로 이동하여 편집기의 세부 설정(테마 등)을 조정할 수도 있습니다.

반응형
반응형

Godot엔진에 대해 알아보겠습니다. 이름(...이라기보다는 발음)에 대한 논란이 지속적으로 발생하여 새로운 이름에 대해 커뮤니티를 중심으로 끊이지 않자, 최근 새로운 이름 Godette로 변경하였습니다. 아울러 마스코트도 이상한 톱니머리 얼굴이 아닌 예쁘장한 여학생 캐릭터를 만들었는데요. 머리에 뿔은 이 엔진의 동질성일까요? 계속 동일한 뿔모양을 가져가는 모습입니다. 본 포스팅에서는 기존부터 익숙히 알고 있던 이름인 관계로 Godot라는 명칭을 사용하겠습니다.

 

아르헨티나에 본사를 둔 OKAM이라는 회사에서 인하우스 툴로 사용하던 게임엔진로 이를 MIT 라이센스하에 오픈소스로 배포한 것이라고 합니다. 주요 특징으로는

 

1. 완전 무료

MIT 라이센스 하에 배포되다보니 다른 제한사항도 없고 사용은 물론 수정하여 배포하는 것, 상용으로 사용하는 것까지도 완전 무료인 게임엔진입니다. 그리고 앞으로도 항구적 무료를 유지하기 위해 이를 비영리 자선기관인 Software Freedom Conservancy(소프트웨어 자유 보호단)가 법적으로 대리하고 있다고 합니다. 

 

2. 크로스플랫폼 지원

Godot 엔진은 주요 데스크톱 플랫폼(Linux, macOS, Windows)은 물론 모바일(Android, iOS) 및 웹 기반(HTML5) 플랫폼까지 지원하는 특징을 갖고 있습니다. 

 

3. 작은 용량

Windows용 Standard 64bit버전은 27.4MB, C#을 지원하는 Mono 64bit 버전은 57.9BM에 불과할 정도로 매우 작은 용량입니다. 단, 게임을 배포하려면 템플릿을 추가로 받아야 하는데, 이게 약 200MB정도로 꽤 큽니다. 그럼에도 불구하고 코드편집기, 애니메이션 편집기, 타일맵 편집기, 셰이더 편집기, 디버거 등이 포함되어 있습니다.

 

4. 지원언어

Godot엔진은 GDScript라는 자체 스크립트 언어를 사용하고 있습니다. 기존에는 Lua를 사용했고, Python으로도 구현해보려고 하였으나, 여러가지 사유로 결국 자체 스크립트 언어를 만들게 되었다고 합니다. 그 외에도 C#, C++을 지원하고 있으며, 순수 Python을 사용할 수도 있는데, Addon과 C컴파일러를 별도로 설치해야 하는 등의 불편이 좀 있습니다. 그리고 VisualScript를 지원합니다. Visual Script는 일일이 코딩하는 방식이 아니라 블럭을 연결하는 방식으로, 비프로그래머에게 어필하기 위한 스크립팅 방식입니다. 그리고 Community에 의해 구축된 진짜 Python, Rust, Lua 지원 라이브러리도 있습니다. 

 

5. Godot의 핵심 개념

엔진 내에서 대부분의 게임 요소는 트리 구조의 씬(Scene)으로 만들어집니다. 장면, 게임오브젝트, 캐릭터 등이 하나의 씬, 또는 여러개의 씬을 트리로 만들어 작동합니다. 씬은 노드(Node)가 모여 이루어지며, 노드는 다시 리소스(Resource)가 모여 이루어집니다. 게임에 필요한 기능 대부분은 이 노드를 이용하여 만듭니다. 예를 들어 버튼을 만들기 위한 'Button' 노드가 있고 타일맵을 만들기 위한 'TileSet'노드와 이를 사용하는 'TileMap' 노드가 있다. 씬도 다른 씬의 하위 멤버로 추가하여(인스턴싱) 다른 씬의 노드가 될 수도 있습니다. 이렇게 여러 노드와 씬이 중첩되어서 캐릭터가 되고, 아이템이 되고 노드끼리 시그널을 주고 받으면서 게임을 만드는 것이 Godot의 컨셉입니다.
 

(1) Scene(장면, 씬)

Godot에서의 게임은 재사용 씬을 모아 구성됩니다. 캐릭터, 무기, 사용자 인터페이스의 메뉴, 집 한채, 레벨 전체 등 생각할 수 있는 모든 것이 씬으로 구성될 수 있습니다. 유니티 엔진에서의 프리팹과 씬의 역할을 모두 수행합니다.

씬의 하위에 다른 씬을 배치할 수도 있습니다. 예를 들어 Player씬을 Level씬에 드래그앤 드랍으로 끌어다가 하위에 배치할 수 있습니다.

 

(2) 노드(Node)

씬은 하나 이상의 노드로 구성 됩니다 . 노드는 씬 트리를 구성하는 가장 기본이되는 요소입니다. 아래는 Character 씬의 노드 구성 예입니다. 물론 노드 내부는 수많은 Resource들로 구성되어있지만, 각 노드는 하나의 역할을 하도록 구성되어 있어, Godot에서의 게임 제작은 노드를 기준으로 생각하는 것이 적절합니다.

KinematicBody2D노드를 이용하여 "Character"노드를 만들고, 하위 구성으로는 이미지를 담당하는 Sprite2D노드, 카메라를 담당하는 Camera2D노드, 충돌을 감지하는 CollisionShape2D노드가 모여 구성됩니다. 이 씬(Character)을 다른 씬의 하위로 다시 불러오게 되면 하위 노드들(Camera2D 등)은 나타나지 않고 Character 노드 하나만 나타납니다. 모두 나타나게 하기 위해서는 '편집할 수 있는 자식' 기능을 체크해서 편집을 계속 할 수도 있습니다.

Godot는 다양한 기능을 수행할 수 있는 기능 라이브러리를 제공합니다. 2D, 3D작업 및 사용자 인터페이스 구성에서 대부분의 작업을 이 노드 리스트들을 사용하여 수행합니다.

 

 

(3) 씬 트리

최종 게임은 여러 씬들이 모여 씬 트리 형태로 표시됩니다. 각각의 씬도 결국 노드들의 트리지만, 하위 씬을 추가했을 때에는 기본적으로 씬도 단일 노드로 표시됩니다. 캐릭터, 무기, 문 또는 사용자 인터페이스를 나타낼 수 있는 씬의 관점에서 게임을 생각하는 것이 더 게임 제작 및 관리 입장에서 좀 더 효율적일 수 있습니다. 단, '편집할 수 있는 자식' 기능을 체크할 경우 자식노드도 표시하여 편집을 계속할 수 있습니다.

 

(4) 시그널

노드들 간에 통신을 할 수 있는 시그널의 개념이 있습니다. 예를 들면 CollisionShape 에 적이 충돌하면 죽거나, 키보드 클릭했을 시 움직임 등을 처리할 수 있게 되는거죠.

 

 

 

 

반응형
반응형

- stage_menu.tscn에서 새 스크립트를 추가

- game.gd로 저장

<game.gd>

- Project Settings > Autoload 에 game.gd파일 추가

- hud에 최고기록을 표시하는 라벨 추가

- stage_game.tscn > tex_score 노드 추가

- 노드 이름을 tex_bestscore로 변경

- 스크립트를 clear해주고, 다시 builtin script 추가

- 스크립트 이름을 tex_bestscore로 지정

- stage_game.tscn씬 > tex_score노드 > tex_score스크립트 수정

 

...길다....

 

- 끝 -

반응형
반응형

- 새로운 씬 생성

- 빈 Node 추가 후 audio_player로 이름 변경, audio_player.tscn으로 저장

 

- Music 추가하기

- AudioStreamPlayer노드 2개 추가

- 하나는 배경음악 설정을 위한 노드 (background로 이름 변경), Sound에 music.ogg설정

- 다른하나는 효과음 설정을 위한 노드 (effect로 이름 변경)

- Autoplay에 체크하여 시작 후 계속 플레이되도록 설정

 

- audio_player.gd 스크립트 추가

extends Node

func _ready():
	pass
	
func play(sample_name):
	#get_node("AudioStreamPlayer").play(sample_name)
	get_node("effect").stream = load(sample_name)
	get_node("effect").play()
	pass

기존 예제에 존재하던 sample_player노드가 사라짐에 따라, 직접 AudioStreamPlayer에 파일을 읽어주는 방식으로 변경함.

 

- audio_player씬을 autoload에 등록.

   프로젝트 어디에서든 실행코드 불러와 사용 가능. 또한 게임 시작 시 자동으로 최초 입력한 배경음악파일(music.ogg)을 실행함.

 

<스크립트 추가>

- ship.gd

- enemy.gd

- laser_ship.gd

- laser_enemy.gd

- powerup_armor.gd

- powerup_laser.gd

- explosion.gd

- 게임 시작 후 enemy 출현까지 약간의 시간간격을 줌

반응형
반응형

<powerup>

- 새로운 씬 생성 후, Area2D노드 추가

- 이름을 powerup으로 변경 후 powerup.tscn으로 저장

- Sprite노드 추가 후 이름을 sprite로 변경

- CollisionShape2D노드 추가 후 이름을 shape으로 변경

- New RectangleShape2D 지정

 

- Extends: (7,7)로 변경

- powerup노드에 powerup.gd스크립트 추가

<powerup_armor>

- 상속씬으로부터 만들기 > powerup.tscn선택

- 이름을 powerup_armor로 변경하고 powerup_armor.tscn으로 저장

- 기존의 스크립트를 제거

- powerup_armor.gd스크립트 새로 추가

 

<ship.gd> 스크립트 수정

- 새로운 상속씬 생성

- powerup.tscn을 상속하여 powerup_laser.tscn생성 후 저장

- sprite > Texture에 powerup_laser.png 지정

- 스크립트 제거 후 새로 생성

- powerup_laser.gd 로 저장

 

<powerup을 무작위로 생성해주는 spawner 시스템>

- spawner enemy.tscn을 상속하여 새로운 씬 생성

- 상속 클리어

- 이름을 spawner_powerup으로 변경

- 스크립트를 고유하게 변경

- 스크립트를 spawner_powerup.gd로 저장

<spawner_powerup.gd>

- stage_game.tscn에 하위씬으로 추가한 후,

- spawner_enemy보다 위쪽에 위치시킴

반응형
반응형

- ship.gd스크립트 수정

- armor_changed 시그널 추가

- set_armor함수에 emit_signal 추가

- Canvas2D노드 추가 후 hud로 이름 변경

- 하위에 sprite노드 추가 후 spr_armor로 이름 변경

- Sprite Texture에 armor.png파일 지정

- Centered는 해제하고,

- 총 수평방향으로 5개의 프레임이 존재(Hframes:5) 인식

- 현재 프레임은 4번째 프레임을(Frame: 4)인식시켜준다.

- spr_armor노드에 스크립트 추가 (Built-In-Script형태로 추가해준다.)

<Score시스템>

- TextureFrame TextureRect노드를 추가 후 tex_score로 이름 변경

- Texture에 score.png 파일 추가

- 노드 사이즈를 적절히 조정 후 Pos (123, 10) 으로 위치 지정

- tex_score하위에 label노드 추가하여 이름을 label로 변경

- Text: 0, Align: Right, Pos:(3,1), Size:(41,14) 지정

- 다이나믹 폰트 지정

- tex_score에 built-in-sciprt 추가

- Name: tex_score 지정

-  새로운 값이 들어오면 텍스트를 새 값으로 변경해줌

- 새 값을 전달해주는 함수는 enemy.gd에서 수정

 

<main메뉴 만들기>

- 빈 Node를 추가하여 이름을 main으로 바꾸고

- stage_menu.tscn으로 저장

- CanvasLayer2D노드 추가 후 hud로 이름 변경

- TextureButton 노드 추가 후 btn_start로 이름 변경

- Texture에서 각 경우에 맞게 텍스쳐 이미지 지정

    Normal: button_normal.png

    Pressed: button_pressed.png

    Hover: button_hover.png

- 위치 조정 (67, 134)

- 하위에 라벨 노드를 추가하고, Text: Start, Align:Center 지정

- 노드 사이즈를 이미지에 맞게 조정

- 폰트를 HUD의 다이나믹 폰트에서 복사/붙여넣기 한다.

<Quit버튼 만들기>

- btn_start를 복제하여 만들기

- 위치를 67,155로 변경

- Text: QUIT 로 변경하고 위치 미세조정

- btn_start에서 스크립트 추가(Attach Script)

- 이름을 btn_start로 지정 후 스크립트 생성

- btn_quit노드에도 built-in-script추가

- Name: btn_quit 지정

- btn_start의 스크립트를 복사 후, _on_pressed()함수에서 작동하는 부분만 수정

- Project Settings에서 시작씬으로 stage_menu.tscn을 지정

< 죽었을 때 메뉴버튼 나타내기>

- stage_game.tscn > hud노드에 Merge from Scene

- stage_menu.tscn > btn_start 버튼을 가져온다.

- 버튼 이름을 btn_menu로 변경하고,

- label노드의 Text: MENU로 변경한 뒤 노드 사이즈를 미세조정한다.

- 시작시에 이 버튼은 나타나지 않도록 숨겨줌

- 스크립트는 고유하게 변경해줌

- 스크립트 편집

시그널 " exit_tree" -> " tree_exited" 로 변경

 

반응형

+ Recent posts