Из Unity в Godot

Данное руководство содержит обзор движка Godot Engine с точки зрения пользователя Unity и направлено на то, чтобы помочь вам перенести ваш существующий опыт Unity в мир Godot.

Различия

  Unity Godot
Лицензия Собственная, закрытая, бесплатная лицензия с лимитом доходов и ограничениями на использование Лицензия MIT, свободная и с полным открытым исходным кодом без каких-либо ограничений
ОС (редактор) Windows, MacOS, Linux (неофициальные и неподдерживаемые) Windows, macOS, X11 (Linux, *BSD)
ОС (экспорт)
  • ПК: Windows, MacOS, Linux
  • Мобильный: Android, iOS, Windows Phone, 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
  • ТВ: Android TV, Samsung SMART TV, tvOS
  • ПК: Windows, MacOS, X11
  • Мобильный: Android, iOS
  • Веб: WebAssembly
  • Консоли См. Console support in Godot
  • VR: Oculus Rift, SteamVR
Система сцен
  • Component/Scene (GameObject > Component)
  • Префабы
Древо сцен и узлы, позволяющие сценам быть вложенными и/или наследовать другие сцены
Сторонние инструменты Visual Studio или VS Code
Killer features
  • Огромное сообщество
  • Большой магазин ассетов

Редактор

Godot Engine предоставляет многофункциональный редактор, который позволяет вам создавать игры. На рисунках ниже показаны оба редактора с цветными блоками для обозначения общих функций.

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

Обратите внимание, что редактор Godot позволяет вам закрепить любую панель к нужной стороне редактора.

Хотя оба редактора могут показаться похожими на первый взгляд, но существует много различий. Оба варианта позволяют организовать проект с использованием файловой системы, но подход Godot проще: один конфигурационный файл, минималистский текстовый формат и отсутствие метаданных. Все это способствует тому, что Godot гораздо дружелюбнее относится к системам VCS, таким как Git, Subversion или Mercurial.

Панель «Сцена» Godot аналогична панели «Иерархия» в Unity, но, поскольку каждый узел имеет свою специфическую функцию, подход, используемый Godot , более наглядно описывает его. Другими словами, легче понять, что делает та или иная сцена с первого взгляда.

Инспектор в Godot более минималистский и спроектирован так, чтобы показывать только свойства. Благодаря этому объекты могут экспортировать пользователю гораздо большее количество полезных параметров без необходимости скрывать функциональность в языковых API. К тому же, Godot позволяет визуально анимировать любое из этих свойств, поэтому изменение цвета, текстур, перечислений и даже ссылок на ресурсы в режиме реального времени возможно без использования кода.

Наконец, панель инструментов в верхней части экрана похожа лишь тем, что позволяет управлять запуском проекта, но проекты в Godot запускаются в отдельном окне, они не выполняются внутри редактора (но дерево и объекты все еще могут быть исследованы в окне отладчика).

This approach has the disadvantage that 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 же сохраняет, запускает проект, закрывает его, а затем перезагружает предыдущее состояние проекта).
  • Редактирование в реальном времени гораздо более полезно, поскольку изменения, внесенные в редактор, вступают в силу немедленно в самой игре и не сбрасываются (и не требуют синхронизации), после закрытия. Это позволяет создавать невероятные вещи, такие как создание уровней во время игры.
  • Редактор более стабилен, потому что игра запущена в отдельном процессе.

Наконец, верхняя панель инструментов содержит меню для удаленной отладки. Эти опции упрощают развертывание на устройстве (подключенном телефоне, планшете или браузере через HTML5), а также отладку/редактирование в реальном времени после экспорта игры.

Система сцен

Это самое важное различие между Unity и Godot и, на пожалуй самая любимая особенность для большинства пользователей Godot.

Система сцен Unity состоит из встраивания всех необходимых ресурсов в сцену и связывания их вместе путем установки компонентов и скриптов.

Система сцен Godot отличается тем, что на самом деле состоит из древа сцен, состоящего из узлов. Каждый узел имеет свое назначение: Спрайт, Сетка, Свет и т.д. По сути, это похоже на сценическую систему Unity. Однако каждый узел может иметь несколько дочерних узлов, что делает каждый из них наследником главной сцены. Это означает, что вы можете составить целую сцену с разными сценами, сохраненными в разных файлах.

Например, подумайте об уровне в каком-нибудь платформере. Вы бы составили его такими элементами:

  • Кирпичи
  • Монеты
  • Игрок
  • Враги

В Unity вы бы поставили на сцену все GameObjects (Игровые Объекты): игрока, несколько экземпляров врагов, кирпичи повсюду, чтобы сформировать основу уровня, а затем несколько экземпляров монет по всему уровню. Затем вы добавляете различные компоненты к каждому элементу, чтобы связать их и логику на уровне: Например, вы бы добавили BoxCollider2D ко всем элементам сцены, для столкновений. Этот принцип отличается в Godot.

В Godot вы бы разделили всю сцену на 3 отдельные, небольшие сцены, которые затем были бы приведены в качестве экземпляра в основной сцене.

  1. Сначала сцена для Игрока.

Рассматривайте игрока как многоразовый элемент на других уровнях. Он состоит, в частности, из одного узла: узла AnimatedSprite, который содержит текстуры спрайта для формирования различных анимаций (например, анимация ходьбы)

  1. Вторая сцена для Врага.

Опять же, враг является многоразовым элементом на других уровнях. Это почти то же самое, что и с узлом Player - единственное отличие заключается в скрипте (который, в основном, управляет ИИ) и текстурах, используемых AnimatedSprite.

  1. Последняя это сцена самого уровня.

Она состоит из кирпичей (для платформ), монет (которые должен ловить игрок) и определенного количества экземпляров сцены врага. Это будут разные, отдельные враги, чье поведение и внешний вид будут такими же, как определено на сцене врага. Каждый экземпляр затем рассматривается как узел в дереве сцены уровня. Конечно, вы можете установить различные свойства для каждого узла с Врагом (например, изменить его цвет).

Наконец, основная сцена будет состоять из одного корневого узла с 2 дочерними: экземпляр узла Игрок и узла Уровень. Корневым узлом может быть что угодно, обычно «корневой» тип, например, «самый глобальный тип узла» или «Node2D» (корневой тип всех 2D-узлов), «Spatial» (корневой тип всех 3D-узлов) или «Control» (корневой тип всех GUI-узлов).

Как видите, каждая сцена организована в виде дерева. То же самое можно сказать и о свойствах самих узлов: вы не добавляете к узлу коллизию, чтобы дать ему возможность сталкиваться, как это делает Unity. Вместо этого, вы делаете этот узел ребенком нового узла, который имеет свойство столкновения. Godot имеет различные типы узлов столкновений, в зависимости от использования (см. Введение в физику).

  • Вопрос: Каковы преимущества этой системы? Разве эта система не увеличит сложность древа сцены? Кроме того, Unity позволяет организовывать GameObjects, помещая их в пустые GameObjects.

    • Во-первых, эта система ближе к известной объектно-ориентированной парадигме: Godot предоставляет ряд узлов, которые не являются однозначно «игровыми объектами», но они предоставляют своим детям собственные возможности: это наследование.
    • Во-вторых, выделение поддерева сцены позволяет сделать из него собственную сцену, что отвечает на второй и третий вопросы: даже если древо сцены становится слишком глубоким, его можно разделить на более мелкие. Это также позволяет найти лучшее решение для многократного использования, поскольку вы можете включить любое поддерево в качестве дочернего узла любого другого узла. Размещение нескольких узлов в пустом GameObject в Unity не дает одинаковых возможностей, за исключением визуальной организации.

Это наиболее важные понятия, которые вы должны запомнить: «узел», «родительский узел» и «дочерний узел».

Организация проекта

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

Ранее мы уже отмечали, что не существует идеального решения для создания структуры проекта. Любое решение будет работать на Unity и Godot, поэтому этот момент не имеет большого значения.

Однако мы часто наблюдаем общую архитектуру для проектов Unity, состоящая из одной папки Assets в корневом каталоге, которая содержит различные папки, по одной на каждый тип ресурса: аудио, графика, модели, материалы, скрипты, сцены и т. д.

Как было сказано ранее, система сцен Godot позволяет разбивать сцены на сцены поменьше. Поскольку каждая сцена и под-сцена в действительности представляют собой один файл сцены в проекте, мы рекомендуем организовать ваш проект немного по-другому. Вот страница вики: Организация проекта.

Где мои префабы?

Концепция префабов, предложенная Unity, является «шаблонным» элементом сцены. Он многоразовый, и каждый экземпляр префаба, который существует в сцене, имеет свои особенности, но все они имеют те же самые свойства, что определены префабом.

Godot не предоставляет префабов как таковых, но их функциональность может быть заменена благодаря системе сцен: Как мы видели, система сцен организована как дерево. Godot позволяет сохранить поддерево сцены в качестве собственной сцены и сохранить его в отдельный файл. Эта новая сцена может повторяться столько раз, сколько вы захотите. Любые изменения, внесенные в эту новую, отдельную сцену, будут применены к ее экземплярам. Однако любые изменения, которые вы внесете в экземпляр, не будут иметь никакого влияния на шаблон этой сцены.

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

Если быть точным, вы можете изменить параметры экземпляра в Инспекторе. Однако узлы, составляющие этот экземпляр, заблокированы, хотя вы можете разблокировать их, если вам нужно, щелкнув правой кнопкой мыши на экземпляре в дереве сцены и выбрав «Editable children» в меню. Вам не нужно делать этого, чтобы добавлять новые дочерние узлы в этот узел, но это возможно. Помните, что эти новые дети будут принадлежать экземпляру, а не «шаблонной» сцене. Если вы хотите добавить новых детей во все экземпляры вашей сцены „шаблона“, то вам нужно добавить их в сцену „шаблона“.

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

Glossary correspondence

  • Игровой Объект -> Узел
  • Добавление компонента -> Наследование
  • Prefab -> Внешняя ветвь

Скриптинг: GDScript, C# и Visual Script

Разработка

Как вы уже знаете, Unity поддерживает C#. C# выгодный из-за интеграции с Visual Studio и других возможностей, таких как статическая типизация.

Godot предоставляет собственный скриптовый язык, GDScript, а также поддержку Visual Script и C#. GDScript берет свой синтаксис из Python, но не связан с ним. Если вы задаетесь вопросом о причинах создания своего скриптового языка, прочитайте, пожалуйста, страницы GDScript basics и Часто задаваемые вопросы. GDScript тесно связан с API Godot и его очень легко освоить: Один вечер для опытного программиста и неделя для новичка.

Unity позволяет вам прикреплять к GameObject столько скриптов, сколько вы хотите. Каждый скрипт добавляет что-то в GameObject: Например, вы можете прикрепить скрипт так, чтобы он реагировал на действия игрока, а другой скрипт управлял его игровой логикой.

В Godot, вы можете прикрепить только один скрипт на каждый узел. Вы можете использовать либо внешний файл GDScript, либо встроить скрипт непосредственно в узел. Если вам нужно прикрепить несколько скриптов к одному узлу, то вы можете рассмотреть два решения, в зависимости от вашей сцены и от того, чего вы хотите достичь:

  • либо добавить новый узел между вашим выбранным узлом и его текущим родителем, а затем добавить скрипт к этому новому узлу.
  • или, вы можете разделить ваш узел на несколько дочерних узлов и прикрепить по одному скрипту на каждый из них.

Как видите, древо сцены легко захламить. Вот почему важно обдумать возможность разделения сложной сцены на несколько, более мелких ветвей.

Связи: группы и сигналы

You can control nodes by accessing them via script and calling built-in or user-defined functions on them. You can also place nodes in a group and call functions on all nodes in this group. See more in the scripting documentation.

Nodes can send a signal when a specified action occurs. A signal can be set to call any function. You can define custom signals and specify when they are triggered. See more in the signals documentation.

Script serialization

Unity может работать с сериализацией скриптов двумя способами:

  • Неявно: Все публичные поля в классе автоматически сериализуются, если тип является сериализуемым (``Dictionary``не сериализуемый).
  • Явно: Непубличные поля могут быть сериализованы с помощью атрибута [SerializeField].

Godot also has a built-in script serialization system, but it works only explicitly. You can serialize any serializable type (built-in and various engine types, including Array and Dictionary) using the export keyword. See the exports documentation for details.

Unity также имеет тип данных под названием ScriptableObject, используемый для сериализации пользовательских ресурсных объектов. Его эквивалент в Godot является базовым классом для всех ресурсов: Resource. Создание скрипта, который наследует Resource, позволит вам создавать собственные сериализуемые объекты. Более подробную информацию о ресурсах можно найти здесь.

Использование C++ в Godot

Godot allows you to develop your project directly in C++ by using its API, which is not possible with Unity at the moment. As an example, you can consider Godot Engine’s editor as a «game» written in C++ using the Godot API.

Если вы заинтересованы в использовании языка C++ в Godot, вы можете прочитать страницу Разработка на С++.