З Unity до Godot Engine

Цей посібник пропонує подивитися на Godot Engine з точки зору користувача Unity, і має допомогти вам перенести наявний досвід 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 organization.

Відмінності

  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
Система сцен
  • Компонент/Сцена (Об'єкт гри (GameObject) > Компонент)
  • Префаби
Scene tree and nodes, дозволяє вкладати сцени та/або успадковувати інші сцени
Сторонні інструменти Visual Studio або VS Code
Помітні переваги
  • Величезна громада
  • Великий магазин ассетів

Редактор

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

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

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

Панель сцени Godot схожа на панель ієрархії Unity, але, оскільки кожен вузол має певну функцію, підхід, що використовується у Godot, є більш візуально описовим. Можна зрозуміти, що робить сцена з першого погляду.

Інспектор у Godot є мінімальним, він демонструє лише властивості. Завдяки цьому об'єкти можуть відкривати користувачеві більш корисні параметри без необхідності приховувати функціональність у мовних API. Як плюс, Godot дозволяє візуально анімувати будь-яку з цих властивостей. Зміна кольорів, текстур, рахунків, або навіть посилань на ресурси в режимі реального часу можлива без необхідності писати код.

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

Кожен має різні переваги:

  • Швидкий запуск проекту та його закриття (Unity мусить зберегти, запустити проект, закрити проект, а потім перезавантажити попередній стан).
  • Редагування в реальному часі більш корисне, оскільки зміни, внесені до редактора, набувають чинності негайно, прямо в грі і не втрачаються (не синхронізуються), при закритті гри. Це дозволяє фантастичні робочі процеси, наприклад, створення рівнів під час відтворення гри.
  • Редактор більш стабільний, оскільки гра працює в окремому процесі.
  • The running game can be explored from different angles by toggling the "Camera Override" button in the editor viewport, which will switch between using the editor view and the game camera view.

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

Система сцен

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

Робота з "рівнем" в Unity зазвичай означає вбудовування всіх необхідних ассетів в сцену та пов'язування їх із компонентами та скриптами.

Система сцен Godot схожа на Unity. "Рівень" складається з набору вузлів, кожен з яких має своє призначення: спрайт, сітка (меш), світло тощо. Однак у Godot вузли розташовані в дереві. Кожен вузол може мати декілька нащадків, що робить кожного під-сценою головної сцени. Це означає, що ви можете створити цілу сцену з різними сценами, що зберігаються в різних файлах.

Наприклад, подумайте про рівень платформера. Ви можете скласти його з декількох елементів:

  • Цегла
  • Монети
  • Гравець
  • Вороги

В Unity ви б поставили на сцену всі GameObjects: гравця, кілька екземплярів ворогів, цеглу для ґрунту рівня, кілька екземплярів монет по всьому рівню. Потім ви додасте різні компоненти до кожного елемента, щоб зв'язати їх і додати логіку на рівні: Наприклад, ви додали BoxCollider2D до всіх елементів сцени, щоб вони могли зіткнутися. Цей принцип інакший у Godot.

У Godot ви розділили б всю свою сцену на три окремі менші сцени та вставили їх у головну сцену.

  1. Сцена тільки для гравця

Розглянемо гравця як елемент, який ми хотіли б використовувати в різних сценах предків (наприклад, сценах "рівнів"). У нашому випадку для елемента гравця потрібен щонайменше вузол AnimatedSprite. Цей вузол містить текстури спрайту, необхідні для різних анімацій (наприклад, анімація ходьби).

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

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 behavior) and the sprite textures used by the AnimatedSprite node.

  1. Сцена рівня

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 behavior 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 є різні вузли зіткнення типів, залежно від використання (дивіться Physics introduction).

  • Які переваги цієї системи? Чи не може ця система потенційно збільшити глибину дерева сцен? І чи Unity вже не дозволяє вам організувати GameObjects, помістивши їх всередину порожніх GameObjects?

    • Система Godot ближче до відомої об'єктно-орієнтованої парадигми: Godot пропонує ряд вузлів, які не є чітко «ігровими об'єктами», але вони надають своїм нащадкам власні можливості: це спадковість.
    • Godot дозволяє видобувати гілку дерева сцени, щоб зробити її незалежною сценою. Отже, якщо дерево сцени стає занадто глибоким, воно може бути розділене на більш дрібні під-сцени. Вони кращі для повторного використання, оскільки ви можете включити будь-який під-сцену в якості нащадка будь-якого вузла. Вкладка декількох GameObjects в порожній GameObject в Unity не забезпечує таку саму функціональність.

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

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

Немає ідеальної архітектури проектів. Будь-яку архітектуру можна спроектувати так, щоб вона працювала як в Unity, так і в Godot.

Однак загальна архітектура проектів Unity полягає в тому, щоб у кореневому каталозі містилася одна папка активів, яка містить різні папки, по одній на кожен тип об'єкта: Аудіо, Графіку, Моделі, Матеріали, Скрипти, Сцени тощо.

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

Де мої префаби?

Префаби, передбачені в Unity, є елементом "шаблону" сцени. Вони багаторазового використання, і кожен екземпляр префабу, який існує на сцені, має своє особисте існування, але всі вони мають ті самі властивості, що визначені в префабі.

Godot не надає префаби, але таку ж функціональність забезпечує його система сцен: Система сцен організована як дерево. Godot дозволяє зберегти будь-яку гілку дерева сцени, як файл окремої сцени. Цю нову сцену можна потім вставляти стільки разів, скільки ви хочете, в якості нащадка будь-якого вузла. Будь-яка зміна, внесена в цю нову окрему сцену, буде застосована до її вже вставлених екземплярів. Однак будь-які зміни, внесені до екземпляра, не матимуть ніякого впливу на сцену 'шаблону'.

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

Якщо бути точним, ви можете змінити параметри екземпляра на панелі Інспектор. Вузли, які складають цей екземпляр, спочатку заблоковані. Ви можете розблокувати їх при потребі, клацнувши правою кнопкою миші екземпляр у дереві сцени та вибравши в меню "Редагувати дочірній елемент". Вам не потрібно цього робити, щоб додати до цього вузла нових нащадків. Пам'ятайте, що будь-які нові нащадки будуть належати екземпляру, а не 'шаблонній' сцени на диску. Якщо ви хочете додати нових нащадків до кожного екземпляра 'шаблонної' сцени, тоді вам слід додати їх до самої 'шаблонної' сцени.

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

Відповідність слів

  • GameObject (Об'єкт гри) -> Node (Вузол)
  • Додавання компонента -> Спадковість
  • Префаб -> Багаторазовий файл сцени

Написання скриптів: GDScript, C# і Visual Script

Дизайн

Unity підтримує C#. C# виграє від інтеграції з Visual Studio і має такі бажані функції, як статична типізація.

Godot пропонує власну мову для написання скриптів, GDScript, а також підтримку Visual Script та C#. GDScript запозичив свій синтаксис у Python, але не має до нього ніякого відношення. Якщо ви сформувати свою думку щодо власної мови написання скриптів, будь ласка, прочитайте Основи GDScript та Поширені запитання. GDScript сильно прив'язаний до API Godot і його освоєння не потребує багато часу: від одного вечора для досвідченого програміста до тижня для початківця.

Unity allows you to attach as many scripts as you want to a GameObject. Each script adds a behavior to the GameObject: For example, you can attach a script so that it reacts to the player's controls, and another that controls its specific game logic.

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

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

Як бачите, впорядкувати дерево сцен доволі легко. Просто розгляньте розділення будь-якої складної сцени на кілька, менших гілок.

Зв'язки: групи і сигнали

Ви можете керувати вузлами, отримуючи доступ до них за допомогою скрипту та викликаючи вбудовані, або визначені користувачем, функції в них. Ви також можете розміщувати вузли в групі та виконувати функції виклику для всіх вузлів цієї групи. Детальніше дивіться в scripting documentation.

Вузли можуть надсилати сигнал, коли відбувається визначена дія. Сигнал може бути встановлений для виклику будь-якої функції. Ви можете визначити власні сигнали та вказати, коли вони спрацьовують. Детальніше дивіться в signals documentation.

Серіалізація скриптів

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

  • Неявний: Усі загальнодоступні поля в класі автоматично серіалізуються, якщо тип є серіалізаційним типом ( Dictionary не серіалізаційний).
  • Явний: Непублічні поля можна серіалізувати за допомогою атрибута [SerializeField].

У Godot також є вбудована система серіалізації скриптів, але вона працює лише явно. Ви можете серіалізувати будь-який серіалізовуваний тип (built-in and various engine types, включаючи Array та Dictionary), використовуючи ключове слово export. Для детальної інформації дивіться exports documentation.

Unity також має тип даних, який називається, що ScriptableObject і використовується для серіалізації користувацьких ресурсних об'єктів. Його еквівалент у Godot є базовим класом для всіх ресурсів: Resource. Створення скрипту, який успадковує Resource, дозволить вам створити власні об'єкти, які серіалізуються. Більше інформації про ресурси можна знайти тут here.

Використання C++ в Godot

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

Якщо ви зацікавлені у використанні C++ в Godot, ви можете прочитати сторінку Розробка в C++.