Из Unity в Godot

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

Примечание

В этой статье речь пойдет о более старых версиях Unity. Вложенные префабы ('Nested prefabs') были добавлены в Unity 2018.3. Вложенные префабы аналогичны сценам в Godot и позволяют использовать более 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

Система сцен

  • Component/Scene (GameObject > Component)

  • Префабы

Древо сцен и узлы, позволяющие сценам быть вложенными и/или наследовать другие сцены

Сторонние инструменты

Visual Studio или VS Code

Заметные преимущества

  • Огромное сообщество

  • Большой магазин ассетов

Редактор

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

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

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

Панель "Scene" Godot аналогична панели "Hierarchy" в Unity, но, поскольку каждый узел имеет свою конкретную функцию, подход, используемый Godot, более наглядный визуально. Легче понять, что делает сцена с первого взгляда.

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

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

У этого подхода несколько преимуществ:

  • Запуск и закрытие проекта происходит быстро (Unity же сохраняет, запускает проект, закрывает его, а затем перезагружает предыдущее состояние проекта).

  • Редактирование в реальном времени гораздо более полезно, поскольку изменения, внесенные в редактор, вступают в силу немедленно в самой игре и не сбрасываются (и не требуют синхронизации), после закрытия. Это позволяет создавать невероятные вещи, такие как создание уровней во время игры.

  • Редактор более стабилен, потому что игра запущена в отдельном процессе.

  • Запущенную игру можно исследовать под разными углами, переключая кнопку «Переопределение камеры» в окне просмотра редактора, которая будет переключаться между использованием вида редактора и вида игровой камеры.

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

Система сцен

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

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

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

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

  • Кирпичи

  • Монеты

  • Игрок

  • Враги

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

В Godot вы разбили бы всю сцену на три отдельные, меньшие сцены, и поместили бы их в главную сцену.

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

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

  1. Сцена для Врага.

Враг - это также элемент, который мы хотели бы использовать в нескольких сценах. Это почти то же самое, что узел игрока. Единственные различия - это сценарий (он нуждается в процедурах "искусственного интеллекта", чтобы генерировать поведение противника) и текстуры спрайтов, используемые узлом AnimatedSprite.

  1. Сцена уровня.

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

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 имеет различные типы узлов столкновений, в зависимости от использования (см. Введение в физику).

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

    • Система Godot ближе к известной объектно-ориентированной парадигме: Godot предоставляет ряд узлов, которые явно не являются "Game Objects", но они предоставляют своим детям свои собственные возможности: это наследование.

    • Godot позволяет извлечь поддерево сцены, чтобы сделать ее своей собственной сценой. Поэтому, если дерево сцен становится слишком глубоким, его можно разбить на более мелкие поддеревья. Это лучше для повторного использования, так как вы можете включить любое поддерево в качестве дочернего элемента любого узла. Размещение нескольких GameObjects в пустом GameObjects в Unity не обеспечивает одинаковой функциональности.

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

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

Нет идеальной проектной архитектуры. Любая архитектура может быть сделана так, чтоб работала и в Unity, и в Godot.

Однако общая архитектура для проектов Unity состоит в том, чтобы иметь одну папку активов в корневом каталоге, содержащую различные папки, по одной для каждого типа активов: Audio, Graphics, Models, Materials, Scripts, Scenes и т.д.

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

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

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

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

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

Чтобы быть точным, вы можете изменить параметры экземпляра на панели инспектора (Inspector). Узлы, составляющие этот экземпляр, изначально заблокированы. Вы можете разблокировать их, если вам это нужно, щелкнув правой кнопкой мыши экземпляр в дереве сцен и выбрав в меню пункт "Editable children". Вам не нужно делать это, чтобы добавить новые дочерние узлы к этому узлу. Помните, что все новые дочерние элементы будут принадлежать экземпляру, а не шаблонной сцене на диске. Если вы хотите добавить новых детей к каждому экземпляру вашей 'шаблонной' сцены, то вы должны добавить их в 'шаблонную' сцену.

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

Словарь соответствий

  • GameObject (игровой объект) -> Node (узел)

  • Добавление компонента -> Наследование

  • Prefab (префаб) -> Reusable Scene file (многократно используемый файл Сцены)

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

Разработка

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

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

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

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

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

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

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

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

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

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

Сериализация сценариев

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

  • Неявно: Все публичные поля в классе автоматически сериализуются, если тип является сериализуемым (Dictionary не сериализуемый).

  • Явно: Непубличные поля могут быть сериализованы с помощью атрибута [SerializeField].

Godot также имеет встроенную систему сериализации сценариев, но она работает только явно. Вы можете сериализовать любой сериализуемый тип (как встроенный, так и производный, включая Array and Dictionary), используя ключевое слово export. Подробнее см. документацию об экспорте.

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

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

Godot позволяет вам разрабатывать свой проект непосредственно на C++, используя его API, что в настоящее время невозможно в Unity. В качестве примера можно рассмотреть редактор Godot Engine как "игру", написанную на языке C++ с использованием API Godot.

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