본문 바로가기

레퍼런스/고도엔진

고도엔진 튜토리얼 #15 유니티에서 고도엔진까지(From Unity3D to Godot Engine)

이번 번역은 긴 문장이 많아서 문맥 상 이상한 점이 있을 수 있습니다. 영어를 하실 줄 아시면 직접 페이지를 보는 걸 추천드려요.

--------------------------------------------------------------------------------------------------------------------------------------------




이 가이드는 유니티 사용자의 관점에서 고도엔진을 살펴볼 수 있도록 합니다. 그리고 여러분의 유니티 사용 경험을 고도의 세상에서 사용할 수 있도록 도와주는 것이 목표입니다.


차이점


 

 유니티

 고도

 라이센스

 수익 한도 및 사용 제한이 있는 독점적, 폐쇄적, 무료 라이센스

  MIT 라이센스, 무료이며 아무 제한없는 오픈 소스

 운영체제(편집기)

 Windows, OSX, Linux (비공식적이고 지원되지 않음)

  Windows, X11 (Linux, *BSD), Haiku, OSX

 운영체제(사용)

 데스크톱 : Windows, Linux/SteamOS, OSX

 모바일 : 안드로이드, iOS, Windows Phone, Tizen

 웹 : WebGL

 콘솔 : PS4, PS Vita, XBox One, XBox 360, WiiU, 3DS

 VR : Occulus Rift, SteamVR, Google Cardboard, Playstation VR, Gear VR, HoloLens

 TV : 안드로이드 TV, 삼성 스마트TV, tvOS

  데스크톱 : Windows, X11, OSX

  모바일 : 안드로이드, iOS, 블랙베리(더 이상 사용되지 않는)

  웹 : WebGL, HTML5 (emscripten을 통해)

 씬 시스템

  컴포넌트 / 씬 (GameObject > Component) 프리펩

  씬 트리와 노드, 씬이 얽히고 다른 씬으로부터 상속받는 것을 허용함

 써드-파티 툴

  비주얼 스튜디오나 샤프 에디터

  안드로이드 출력을 위한 안드로이드 SDK

  외부 에디터들은 가능

 장점

  거대한 커뮤니티

  거대한 에셋 스토어

  씬 시스템

  애니메이션 파이프라인

  쓰기 쉬운 쉐이더

  장치에서 디버그 가능



에디터


고도엔진은 여러분의 게임을 만드는 데에 사용할 수 있게 기능이 풍부한 에디터를 제공합니다. 아래에 제시된 두 에디터의 기능별로 색깔 블록으로 보여주고 있다.


../../_images/unity-gui-overlay.png

../../_images/godot-gui-overlay.png

여러분이 고도 에디터의 각 패널을 씬 에디터 사이드의 옆 쪽에 붙일 수 있다는 것을 참고하세요.


두 에디터가 비슷해 보이지만, 겉에 보이는 것 밑에 많은 차이점이 있습니다. 둘 다 파일시스템을 이용해 프로젝트를 구성하지만 단일 구성 파일, 최소화된 텍스트 형식 그리고 메타 데이터가 없어 고도가 조금더 심플합니다. 이 모든 것은 고도가 Git, Subsersion 또는 Mercurial 같은 VCS 시스템에 대해 조금더 우호적으로 변하는데 기여하고 있다.


고도의 씬 패널은 유니티의 계층 패널과 유사하지만 각각의 노드가 특정한 기능을 가지고 있기 때문에, 고도의 접근 방식이 더 시각적으로 묘사된다.

다시 말해서, 특정 씬이 무엇을 하는지 이해하는 것이 더 쉽다.


고도의 Inspector는 더 단순화 되었고 속성만을 보여주기 위해 설계되었습니다. 다행히도, 이로 인해 오브젝트는 언어 API의 기능을 숨기지 않고도 훨씬 많은 양의 유용한 매개 변수를 사용자에게 보여줄 수 있습니다. 이에 더해서 고도는 눈에 보이는 모든 속성을 애니메이션화 할 수 있습니다. 따라서 코드 없이 실시간으로 색깔, 텍스쳐, 열거값 또는 리소스에 연결할 수 있습니다.


마지막으로, 화면의 제일 위에 있는 툴바는 프로젝트 재생을 제어할 수 있다는 점에서 유사하지만, 고도의 프로젝트는 편집기 내부에서 실행되지 않고 별도의 창에서 실행됩니다(하지만 트리와 오브젝트는 디버거 창에서 확인할 수 있습니다).


이 접근 방식은 다른 각도에서 실행 게임을 확인할 수 없다는 단점이 있으며 (이 기능은 향후 지원될 가능성이 있지만 이미 실행 중인 게임에 충돌 기즈모(gizmos)를 표시하는 것이 가능합니다), 이에 대한 장점은 다음과 같습니다 :


  • 프로젝트를 실행하고 닫는 것이 매우 빠릅니다 (유니티는 프로젝트를 실행하기 위해서 저장해야 하고, 프로젝트를 닫고 다시 이전 상태를 로드해야 합니다.)
  • 라이브 편집은 편집기에 대한 변경 사항이 게임에 즉시 적용되며 게임이 종료되었을 때 손실되지 않아(동기화되지 않기 때문입니다) 훨씬 유용합니다. 이러면 게임을 플레이하면서 레벨을 만드는 것과 같은 환상적인 워크 플로우를 사용할 수 있습니다.
  • 게임이 분리된 프로세스에서 실행되므로 에디터가 좀 더 안정적입니다.

마지막으로, 상단 도구모음에는 원격 디버깅을 위한 메뉴가 포함되어 있습니다. 이러한 옵션을 사용하면 기기(HTML을 통해 연결된 전화기, 태블릿 또는 브라우저)에 간편하게 구축할 수 있으며, 게임을 출력한 이후에 디버그/라이브 편집이 가능합니다.


씬 시스템


이게 유니티와 고도의 가장 큰 차이입니다. 고도 유저들이 가장 좋아하는 특징입니다.


유니티의 씬 시스템은 하나의 씬에 필요한 모든 에셋이 포함되도록 하고 구성 요소 및 스크립트를 해당 에셋에 설정하여 이들 에셋을 서로 연결하는 것으로 구성됩니다.


고도의 씬 시스템은 다릅니다 : 노드로 이루어진 트리로 구성되었습니다. 각 노드는 목적을 가집니다 : 스프라이트, 메시, 조명... 기본적으로, 이것은 유니티의 씬 시스템과 비슷합니다. 그러나, 각 노드는 다수의 자식이 있을 수 있으며, 이로 인해 각 하위 항목이 메인 씬의 하위 섹션으로 생성됩니다. 이것은 다른 파일에 저장되어 있는 다른 씬들로 하나의 씬을 구성할 수 있다는 것을 뜻합니다.


예를 들면, 플랫폼 레벨을 생각해보자. 다음과 같은 여러 요소로 구성할 수 있습니다 :


  • 벽돌
  • 동전
  • 플레이어
  • 적군

유니티에서, 여러분은 씬에서 게임오브젝트를 둘 수 있습니다 : 플레이어, 여러 인스턴스화된 적군, 레벨의 딱을 형성하는 모든 곳의 벽돌, 그리고 레벨 전체에 걸친 많은 동전의 인스턴스 등. 그런 다음 각 요소에 다양한 구성 요소를 추가하여 연결하고 논리적 레벨을 추가합니다 : 예를 들어 충돌이 발생할 수 있도록 BoxCollide2D를 씬의 요소에 추가합니다. 이 원칙은 고도에 따라 다르다.

고도에서는 여러분은 씬을 3개의 작은 씬으로 나눌 수 있습니다. 그러고 나서 메인 씬에서 인스턴스를 만듭니다.


1. 먼저 플레이어 혼자를 위한 씬입니다.

플레이어를 다른 레벨에서 재사용 가능한 요소로 간주합니다. 특히 다음과 같은 노드로 구성됩니다 : 다양한 애니메이션을 형성하는 스프라이트 텍스쳐가 포함되어 있는

AnimatedSprite (예를 들어 걷는 애니메이션)


2. 두번째로 적군을 위한 씬입니다.


다시, 적을 다른 레벨에서 재사용 가능한 요소로 간주합니다. 거의 플레이어 노드와 같습니다 - 유일하게 다른 점은 스크립트이고(거의 대부분 AI를 다루는) AnimatedSprite로 사용된 스프라이터 텍스쳐들입니다.


3. 마지막으로, 레벨 씬입니다.


이는 벽돌(플랫폼용), 동전(플레이어가 붙잡을 수 있도록) 및 특정 숫자의 인스턴스화 된 이전 적 장면의 일부 인스턴스로 구성됩니다. 이는 다른, 분리된 적일 수 있으며 적의 행동과 모양이 적 씬에서 정의된 것과 동일하게 됩니다. 그러면 각 인스턴스가 레벨 씬 트리에서 노드로 간주됩니다. 물론 각 대상 노드에 대해 서로 다른 속성을 설정할 수도 있습니다 (노드의 색을 변경하는 경우)


마지막으로, 메인 씬은 두 자식과 한 루트 노드로 구성되어 있습니다 : 플레이어 인스턴스 노드와 레벨 인스턴스 노드. 루트 노드는 어떤 것도 될 수 있습니다. 보통 가장 글로벌 유형의 "Node"와 같은 "root" 유형이거나 "Node2D(모든 2D-관계 노드의 루트 타입)", "Spatial(3D-관계 노드의 루트 타입)" 또는 "Control(GUI-관계 노드의 루트 타입)"도 가능합니다.


보시다시피, 모든 씬이 트리처럼 정리되어 있습니다. 노드의 속성도 마찬가지입니다 : 여러분은 유니티와 같이 노드에 충돌 구성 요소를 추가하여 충돌 구성 요소를 결합할 수 있게 할 수 없습니다. 대신 이 노드를 충돌 속성이 있는 새 특정 노드의 하위 노드로 만듭니다. 고도는 사용에 따라 다양한 유형의 충돌이 특징이 있습니다(물리 도입을 보세요).


  • 질문 : 어떤게 이 시스템의 이점인가요? 이 시스템이 잠재적으로 트리의 깊이를 높이지 않을까요? 또한 유니티를 사용하면 게임 오브젝트를 빈 게임오브젝트에 넣어 정리할 수 있게 허용됩니다.
    • 먼저, 이 시스템은 잘 알려진 객체 지향의 전형입니다 : 고도는 "게임 오브젝트"가 아닌 몇 개의 노드를 제공합니다, 하지만 그들은 그들의 자식에게 저장공간을 제공합니다 : 이것이 상속입니다.
    • 두번째로, 씬의 하위 트리를 추출해서 자신만의 씬으로 만들어 두번째와 세번째 질문에 답합니다 : 씬 트리가 너무 깊더라도, 작은 서브트리로 나눌 수 있습니다. 이것은 또한 재사용성에서 더 나은 해결책입니다. 어느 노드의 자식으로도 서브트리를 포함할 수 있습니다. 유니티에서 빈 게임오브젝트에 여러 개의 노드를 놓는 것은 시각적인 조직을 제외하고는 동일한 가능성을 제공하지 않습니다.

이것들이 여러분이 기억해야할 주요 개념입니다 : "노드",  "부모 노드" 그리고 "자식 노드".



프로젝트 조직


../../_images/unity-project-organization-example.png

우리는 앞에서 프로젝트 구조를 설정하는 데에 완벽한 해결책이 없다는 것을 보았습니다. 유니티와 고도의 어떤 솔루션도 그렇습니다. 그래서 이 점은 덜 중요한 것이지요.


그러나, 우리는 루트 디렉토리에 여러 개의 폴더를 가지는 하나의 에셋 폴더를 가지는 유니티 프로젝트의 보통의 구조를 자주 보았습니다. 한 에셋 당 하나의 타입으로 : 오디오, 그래픽, 모델, 물질, 스크립트, 씬 등


이전에 설명했듯이 고도의 씬 시스템은 씬을 더 작은 씬으로 나누는 것을 허용합니다. 각 씬과 하위 씬이 실제로 프로젝트의 한 씬 파일이므로 우리는 조금 다르게 구성하는 것이 좋습니다. 이 위키는 이에 대한 내용을 제공합니다 : 프로젝트 조직



제 프리펩은 어디있나요?


유니티에서 제공하는 프리펩에 대한 컨셉은 씬의 '템플릿' 요소입니다. 재사용이 가능하고, 씬에 존재하는 각 프리펩 인스턴스는 자체적으로 존재하지만 모두 프리펩에 의해 정의된 것과 동일한 속성을 갖습니다.


고도는 그런 프리펩을 제공하지 않지만, 이 기능성은 감사하게도 씬 시스템을 이용해 다시 메울 수 있습니다 : 우리가 보았듯이 씬 시스템은 트리의 형태로 조직되어 있습니다. 고도는 여러분이 씬의 서브 트리를 그 자신의 씬으로 저장하게 허용합니다, 그 자신의 파일로 말이죠. 이 새로운 씬은 여러분이 원하는 만큼 인스턴스화 될 수 있습니다. 이 새로운 인스턴스에 행하는 어떤 변화도, 분리된 씬은 그 자신의 인스턴스에 적용됩니다. 그러나 여러분이 인스턴스에 만든 어떤 변화도 '템플릿(template)' 씬에는 어떤 변화도 끼치지 않습니다.


../../_images/save-branch-as-scene.png

확실하게 하자면, 여러분은 인스턴스의 Inspector의 패널에서 매개 변수를 수정할 수 있습니다. 하지만 이 인스턴스를 구성하는 노드는 잠겨 있으며 필요한 경우 씬 트리에서 인스턴스 옆에 있는 클립보드 아이콘을 클릭하여 해당 노드의 잠금을 해제하고 메뉴에서 "Editable children(편집 가능한 하위)"를 선택합니다. 여러분이 이 노드에 새로운 하위 노드를 추가할 때 이렇게 할 필요가 없지만 새로운 자식이 'template(템플릿)' 씬이 아닌 인스턴스에 속한다는 걸 기억하세요. 만약 여러분이 템플릿 씬에 여러분의 모든 인스턴스에 더해진 자식을 더하고 싶으면, 여러분은 애초에 템플릿 씬에 한 번 더하면 됩니다.


../../_images/editable-children.png


용어 사전


GameObject -> Node Add a component -> Inheriting Prefab -> Externalized branch


게임오브젝트 -> 노드에 컴포넌트 더하기 -> 프리펩 상속 -> 외부 지점



스크립팅 : C#부터 GDScript까지


설계

여러분이 이미 알듯이, 유니티는 그 API를 위해 두 개의 언어를 지원합니다 : C#과 자바스크립트 (유니티 스크립트라고 부르는). 두 언어 모두 한 프로젝트에 사용할 수 있습니다 (당연히 같은 파일에는 아닙니다). 둘 중에 하나를 고르는건 개인 취향이며 프로젝트가 작게 남을 때 자바스크립트의 사용으로 퍼포먼스에 크게 영향을 미치지 않는 것처럼 보이기 때문입니다. C#은 비주얼 스튜디오와 통합되어 있어서 정적 입력과 같은 여타 특정 기능을 제공하기 때문에 유용합니다. 


고도는 여러분에게 GDScript라는 자체 언어를 제공합니다. 이 언어는 대부분의 구문을 파이썬에서 차용했지만 연관은 없습니다. 만약 여러분이 Lua나 C# 등이 아니라 GDScript에 대해 궁금하다면 GDScript나 FAQ 페이지를 읽어보세요. GDScript는 고도 API와 강하게 연결되어 있고 배우기 쉽습니다 : 숙련된 프로그래머에게는 하루 저녁 그리고 시작하는 프로그래머는 일주일 정도 걸립니다.


유니티는 게임 오브젝트에 원하는 만큼의 스크립트를 붙일 수 있습니다. 각 스크립트는 게임오브젝트에 행동을 더합니다 : 예를 들어, 여러분은 스크립트를 더해 플레이어의 컨트롤을 반응하며 다른  스크립트를 더해 특정 게임 로직을 제어할 수 있습니다.


고도에서, 여러분은 노드에 하나의 스크립트만 붙일 수 있습니다. 외부 GDScript 파일 또는 노드에 직접적으로 포함시킬 수도 있습니다. 만약 여러분이 한 노드에 여러 스크립트를 붙일 필요가 있다면, 여러분의 씬 혹은 하고 싶어하는 것에 따라 두 가지를 신경쓸 수 있습니다 :


  • 타겟 노드와 현재 상위 노드 사이에 새 노드를 추가한 다음 이 새 노드에 스크립트를 추가합니다.
  • 혹은, 타겟 노드를 여러개의 자식으로 나누어 각각에 하나의 스크립트를 붙일 수 있습니다.

보시다시피, 씬 트리를 엉망으로 만드는 건 쉽습니다. 이것이 바로 진정한 반성을 하는 것, 복잡한 장면을 여러 개의 작은 가지로 나눌 때에 고려하는 것이 왜 중요한 지가 왜 중요한 지 보여줍니다.


연결 : 그룹과 신호


노드는 스크립트를 사용하여 접근하고 스크립트의 함수(내장 또는 사용자 정의) 호출로 제어할 수 있습니다. 더 있습니다 : 노드들을 하나의 그룹으로 위치시켜 함수를 그룹에 포함된 모든 노드에서 함수를 호출할 수도 있습니다! 자세한 것은 이 페이지에 설명되어 있습니다.


또 있습니다! 특정 노드는 특정 행동이 발생할 때 신호를 던집니다. 여러분은 이 신호를 연결하여 신호 발생 시 특정 함수를 호출할 수 있습니다. 여러분이 스스로의 신호를 정의하고 어디든 원하는 곳으로 보낼 수 있다는 것을 참고하세요. 이 특징은 여기에 적혀있습니다.



C++로 고도 사용하기


여러분께 알려드리기 위해, 고도는 그 API로 여러분의 프로젝트가 C++로 되어있는 것도 지원합니다. 유니티에서는 되지 않는 것이죠. 예로 "game"으로 고도엔진의 에디터가 고도 APi를 사용한 C++로 쓰였다는 것을 고려할 수 있습니다.


여러분이 C++로 고도를 사용하는 것에 관심이 있다면, C++로 개발하기 페이지를 참조하세요.




--------------------------------------------------------------------------------------------------------------------------------------------

이번 번역은 긴 문장이 많아서 문맥 상 이상한 점이 있을 수 있습니다. 영어를 하실 줄 아시면 직접 페이지를 보는 걸 추천드려요.