Unity에서 Godot 엔진까지

이 가이드는 Unity 사용자의 관점에서 Godot 엔진의 개요를 제공합니다, 그리고 존재하는 Unity 경험을 Godot라는 세상에 옮기도록 돕는 것에 중점을 둡니다.

주석

This article talks about older versions of Unity. Nestable prefabs ('Nested prefabs') were added to Unity 2018.3. Nestable prefabs are analogous to Godot's scenes, and allow a more Godot-like approach to scene organisation.

차이점

  Unity Godot
라이선스 수익 상한과 사용 제한이 있는 독점적이고 폐쇄적인 무료 라이선스 MIT 라이선스로, 어떤 제한 없이 무료이고 완전한 오픈 소스
OS (편집기) Windows, macOS, Linux (비공식이고 지원되지 않음) Windows, macOS, X11 (Linux, *BSD)
OS (내보내기)
  • 데스크톱: Windows, macOS, Linux
  • 모바일: Android, iOS, Windows 폰, Tizen
  • 웹: WebAssembly이나 asm.js
  • 콘솔: PS4, PS Vita, Xbox One, Xbox 360, Wii U, Nintendo 3DS
  • VR: Oculus Rift, SteamVR, Google Cardboard, Playstation VR, Gear VR, HoloLens
  • TV: Android TV, Samsung SMART TV, tvOS
  • 데스크톱: Windows, macOS, X11
  • 모바일: Android, iOS
  • 웹: WebAssembly
  • 콘솔: Godot의 콘솔 지원 을 확인하세요
  • VR: Oculus Rift, SteamVR
씬 시스템
  • 컴포넌트/씬(GameObject > Component)
  • 프리펩
Scene tree and nodes, 씬을 중첩하거나 다른 씬을 상속할 수 있습니다
타사 도구 Visual Studio 혹은 VS Code
Notable advantages
  • 거대한 커뮤니티
  • 넓은 애셋 스토어

편집기

Godot Engine provides a rich-featured editor that allows you to build your games. The pictures below display the default layouts of both editors with colored blocks to indicate common functionalities.

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

While both editors may seem similar, there are many differences below the surface. Both let you organize the project using the filesystem, but Godot's approach is simpler with a single configuration file, minimalist text format, and no metadata. This makes Godot more friendly to VCS systems, such as Git, Subversion, or Mercurial.

Godot's Scene panel is similar to Unity's Hierarchy panel but, as each node has a specific function, the approach used by Godot is more visually descriptive. It's easier to understand what a scene does at a glance.

The Inspector in Godot is more minimal, it shows only properties. Thanks to this, objects can expose more useful parameters to the user without having to hide functionality in language APIs. As a plus, Godot allows animating any of those properties visually. Changing colors, textures, enumerations, or even links to resources in real-time is possible without needing to write code.

The Toolbar at the top of the screen is similar in both editors, offering control over project playback. Projects in Godot run in a separate window, rather than inside the editor (but the tree and objects can still be explored in the debugger window).

This approach has the disadvantage that in Godot the running game can't be explored from different angles (though this may be supported in the future and displaying collision gizmos in the running game is already possible), but in exchange has several advantages:

  • 프로젝트를 실행하고 종료하는 것이 빠릅니다 (Unity는 저장하고, 프로젝트를 실행하고, 프로젝트를 종료하고, 그리고 이전 상태를 다시 불러와야 합니다).
  • 실시간 편집은 편집기에서 변경한 사항이 게임에 즉시 적용되고 게임을 끌 때 (동기화 할 필요도 없이) 사라지지 않으니 훨씬 더 유용합니다. 이것으로 플레이 도중 레벨을 만드는 등의 환상적인 워크플로가 가능합니다.
  • 게임이 별도의 프로세스에서 실행되기 때문에 편집기는 더 안정적입니다.

Finally, Godot's top toolbar includes a menu for remote debugging. These options allow deployment to a device (connected phone, tablet, or browser via HTML5), and debugging/live editing on it after the game is exported.

씬 시스템

This is the most important difference between Unity and Godot and the favourite feature of most Godot users.

Working on a 'level' in Unity usually means embedding all the required assets in a scene and linking them together with components and scripts.

Godot's scene system is superficially similar to Unity. A 'level' consists of a collection of nodes, each with its own purpose: Sprite, Mesh, Light, etc. However, in Godot the nodes are arranged in a tree. Each node can have multiple children, which makes each a subscene of the main scene. This means you can compose a whole scene with different scenes stored in different files.

예를 들어, 플랫포머 레벨을 생각해보자. 당신은 여러 요소들을 가지고 작업할 것입니다:

  • 벽돌
  • 동전
  • 플레이어

Unity에서, 모든 GameObjects를 씬에 넣을 것입니다: 플레이어, 여러 인스턴스 된 적, 레벨을 만드는 벽돌, 그리고 모든 레벨에 있는 여러 인스턴스 된 동전입니다. 그런 다음 각 요소들을 연결하고 레벨의 타당성을 주기 위한 다양한 구성 요소를 추가할 것입니다: 예를 들어 모든 요소에 BoxCollider2D를 추가해서 씬의 모든 요소가 충돌할 수 있도록 합니다. 이 원리가 Godot에서는 다릅니다.

In Godot, you would split your whole scene into three separate, smaller scenes, and instance them in the main scene.

  1. A scene for the Player alone.

Consider the player as an element we'd like to use in different parent scenes (for instance 'level' scenes). In our case, the player element needs at least an AnimatedSprite node. This node contains the sprite textures necessary for various animations (for example, a walking animation).

  1. A scene for the Enemy.

An enemy is also an element we'd like to use in several scenes. It's almost the same as the Player node. The only differences are the script (it needs 'AI' routines to generate the enemy's behaviour) and the sprite textures used by the AnimatedSprite node.

  1. A Level scene.

A Level scene is composed of Bricks (for platforms), Coins (for the player to collect) and a number of instances of the Enemy scene. Each instance is a node in the Level scene tree. These instances are separate enemies, which initially have shared behaviour and appearance as defined in the Enemy scene. You can set different properties for each Enemy node (to change its color, for example).

4. A Main scene. The Main scene would be composed of one root node with 2 children: a Player instance node, and a Level instance node. The root node can be anything, generally a "root" type such as "Node" which is the most global type, or "Node2D" (root type of all 2D-related nodes), "Spatial" (root type of all 3D-related nodes) or "Control" (root type of all GUI-related nodes).

보시다시피, 모든 씬이 트리로 조직됩니다. 노드의 속성도 동일합니다: Unity처럼 노드가 충돌 가능하도록 충돌 구성 요소를 추가 할 수는 없습니다. 대신 충돌 속성을 가진 새로운 특정 노드를 자식 으로 만들 수 있습니다. Godot는 사용법에 따른 다양한 충돌 타입 노드가 있습니다 (물리 소개를 참고하세요).

  • What are the advantages of this system? Wouldn't this system potentially increase the depth of the scene tree? And doesn't Unity already allow you to organize GameObjects by putting them inside empty GameObjects?

    • Godot's system is closer to the well-known object-oriented paradigm: Godot provides a number of nodes which are not clearly "Game Objects", but they provide their children with their own capabilities: this is inheritance.
    • Godot allows the extraction of a subtree of a scene to make it a scene of its own. So if a scene tree gets too deep, it can be split into smaller subtrees. This is better for reusability, as you can include any subtree as a child of any node. Putting multiple GameObjects in an empty GameObject in Unity does not provide the same functionality.

프로젝트 조직

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

There is no perfect project architecture. Any architecture can be made to work in either Unity and Godot.

However, a common architecture for Unity projects is to have one Assets folder in the root directory that contains various folders, one per type of asset: Audio, Graphics, Models, Materials, Scripts, Scenes, and so on.

Since Godot allows splitting scenes into smaller scenes, each scene and subscene existing as a file in the project, we recommend organizing your project a bit differently. This wiki provides a page for this: 프로젝트 조직.

프리펩은 어디갔나요?

A prefab as provided by Unity is a 'template' element of the scene. It is reusable, and each instance of the prefab that exists in the scene has an existence of its own, but all of them have the same properties as defined by the prefab.

Godot does not provide prefabs as such, but the same functionality is provided by its scene system: The scene system is organized as a tree. Godot allows you to save any subtree of a scene as a scene file. This new scene can then be instanced as many times as you want, as a child of any node. Any change you make to this new, separate scene will be applied to its instances. However, any change you make to the instance will not have any impact on the 'template' scene.

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

To be precise, you can modify the parameters of an instance in the Inspector panel. The nodes that compose this instance are initially locked. You can unlock them if you need to by right-clicking the instance in the Scene tree and selecting "Editable children" in the menu. You don't need to do this to add new child nodes to this node. Remember that any new children will belong to the instance, not to the 'template' scene on disk. If you want to add new children to every instance of your 'template' scene, then you should add them in the 'template' scene.

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

어휘 일치

  • GameObject -> 노드
  • 컴포넌트 추가 -> 상속
  • Prefab -> Reusable Scene file

스크립팅: GDScript, C# and Visual Script

디자인

Unity supports C#. C# benefits from its integration with Visual Studio and has desirable features such as static typing.

Godot provides its own scripting language, GDScript as well as support for Visual Script and C#. GDScript borrows its syntax from Python, but is not related to it. If you wonder about the reasoning for a custom scripting language, please read the GDScript 기초 and 자주 묻는 질문들(FAQ) pages. GDScript is strongly attached to the Godot API and doesn't take long to learn: Between one evening for an experienced programmer and a week for a complete beginner.

Unity는 GameObject에 원하는 만큼의 스크립트를 붙일 수 있습니다. 각 스크립트는 GameObject에 행동을 추가합니다: 예를 들어 스크립트를 붙여서 플레이어의 조작이나 특정 게임을 조작하는 다른 것을 넣을 수 있습니다.

Godot에서, 우리는 각 노드에 하나의 스크립트만 붙일 수 있습니다. 외부 GDScript 파일이나 노드에 스크립트를 직접 넣어서 사용할 수 있습니다. 한 노드에 더 많은 스크립트를 붙이고 싶다면, 씬이랑 원하는 것을 얻기 위해, 두 가지 방안을 고려하셔야 합니다:

  • 대상 노드와 현재 부모 노드 사이에 새 노드를 추가 한 다음, 이 노드에 스크립트를 추가합니다.
  • 또는, 대상 노드를 여러 자식 노드로 분할하고 각각마다 하나의 스크립트를 붙일 수 있습니다.

As you can see, it can be easy to turn a scene tree to a mess. Consider splitting any complicated scene into multiple, smaller branches.

연결: 그룹과 시그널

스크립트를 통해 노드에 접근하고 노드에서 내장 함수나 사용자가 정의한 함수를 호출하여 노드를 제어할 수 있습니다. 그리고 노드를 그룹에 배치하거나 이 그룹에 있는 모든 노드에서 함수를 호출할 수도 있습니다. 자세한 것은 스크립팅 문서를 참고하세요.

노드는 특정 동작이 발생할 때 시그널을 보냅니다. 시그널은 함수를 호출하도록 설정될 수 있습니다. 커스텀 시그널을 정의하고 언제 시그널을 보낼 지를 지정할 수 있습니다. 자세한 설명은 시그널 문서를 참고하세요.

스크립트 직렬화

Unity는 두 가지 방법으로 스크립트 직렬화를 다룰 수 있습니다:

  • Implicit(암시적): 한 클래스의 모든 퍼블릭 필드가 직렬화 할 수 있는 타입이면 (Dictionary는 직렬화 할 수 없음) 자동으로 직렬화 됩니다.
  • Explicit(명시적): 비 퍼블릭 필드를 [SerializeField] 속성을 사용하여 직렬화 되도록 할 수 있습니다.

Godot 또한 내장 스크립트 직렬화 시스템을 갖추고 있지만, 오직 명시적으로만 작동합니다. 어떤 직렬화 가능한 타입이라도 (class_Arrayclass_Dictionary를 포함한, 내장 그리고 다양한 엔진 타입) export 키워드를 사용해 직렬화 할 수 있습니다. 자세한 설명은 내보내기 문서를 참고하세요.

Unity 또한 커스텀 애셋 객체를 직렬화 하기 위해 사용되는 ScriptableObject 라는 데이터 타입을 갖고 있습니다. Godot에서 이것은 모든 리소스의 기본 클래스에 해당합니다: class_Resource. class_Resource를 상속하는 스크립트를 만드는 것으로 커스텀 직렬화 가능한 객체를 만들 수 있게 됩니다. 리소스에 관한 더 많은 정보는 여기서 볼 수 있습니다.

C++로 Godot 사용하기

Godot는 API를 사용하여 C++로 프로젝트를 직접 개발할 수 있게 해줍니다, 이는 현재 Unity에서는 불가능합니다. 예를 들어 Godot 엔진의 편집기를 Godot API를 사용하는 C++로 작성된 "게임"으로 간주할 수 있습니다.

C++로 Godot를 사용하는 것에 관심이 있으시다면, C++로 개발하기 페이지를 읽고 시작하시면 됩니다.