This translation is community contributed and may not be up to date. We only maintain the English version of the documentation. Read this manual in English
Defold надає спеціалізований редактор GUI та потужні можливості написання скриптів, призначені для побудови й реалізації інтерфейсів користувача.
Графічний інтерфейс користувача у Defold — це компонент (component), який ви створюєте, додаєте до ігрового об’єкта (game object) і розміщуєте в колекції (collection). Цей компонент має такі властивості:
Компоненти GUI відображаються незалежно від ігрового зображення. Тому вони не розміщуються в конкретному місці в редакторі колекцій і не мають у ньому візуального представлення. Однак компоненти GUI мають належати ігровому об’єкту, який має позицію в колекції. Змінення цієї позиції не впливає на GUI.
Компоненти GUI створюються з файлу прототипу сцени GUI (в інших рушіях такі файли також відомі як префаби (prefabs) або шаблони (blueprints)). Щоб створити новий компонент GUI, клацніть правою кнопкою миші потрібне місце у браузері Assets і виберіть New ▸ Gui. Введіть назву нового файлу GUI та натисніть Ok.

Defold автоматично відкриє файл у редакторі сцен GUI.

У панелі Outline перелічено весь вміст GUI: список вузлів і всі залежності (див. нижче).
У центральній області редагування показано GUI. Панель інструментів у правому верхньому куті області редагування містить інструменти Move, Rotate і Scale, а також засіб вибору компонування.

Білий прямокутник показує межі вибраного компонування відповідно до ширини й висоти екрана за замовчуванням, заданих у налаштуваннях проєкту.
Якщо вибрати кореневий вузол “Gui” у панелі Outline, у панелі Properties з’являться властивості компонента GUI:
Per Node коригує кожен вузол відповідно до скоригованого розміру батьківського вузла або зміненого розміру екрана.Disable вимикає режим коригування вузлів. Усі вузли зберігатимуть заданий розмір.128. До них належать текстури, створені за допомогою gui.new_texture(), і зовнішні текстури, призначені GUI за допомогою go.set(..., "textures", ...) або gui.set(msg.url(), "textures", ...). У проєктах, які замінюють багато зовнішніх текстур, може знадобитися збільшити це обмеження.Ви можете змінювати властивості GUI під час виконання з компонента-скрипту за допомогою go.get() і go.set():

go.property("mybigfont", resource.font("/assets/mybig.font"))
function init(self)
-- get the font file currently assigned to the font with id 'default'
print(go.get("#gui", "fonts", { key = "default" })) -- /builtins/fonts/default.font
-- set the font with id 'default' to the font file assigned to the resource property 'mybigfont'
go.set("#gui", "fonts", self.mybigfont, { key = "default" })
-- get the new font file assigned to the font with id 'default'
print(go.get("#gui", "fonts", { key = "default" })) -- /assets/mybig.font
end

go.property("myeffect", resource.material("/assets/myeffect.material"))
function init(self)
-- get the material file currently assigned to the material with id 'effect'
print(go.get("#gui", "materials", { key = "effect" })) -- /effect.material
-- set the material id 'effect' to the material file assigned to the resource property 'myeffect'
go.set("#gui", "materials", self.myeffect, { key = "effect" })
-- get the new material file assigned to the material with id 'effect'
print(go.get("#gui", "materials", { key = "effect" })) -- /assets/myeffect.material
end

go.property("mytheme", resource.atlas("/assets/mytheme.atlas"))
function init(self)
-- get the texture file currently assigned to the texture with id 'theme'
print(go.get("#gui", "textures", { key = "theme" })) -- /theme.atlas
-- set the texture with id 'theme' to the texture file assigned to the resource property 'mytheme'
go.set("#gui", "textures", self.mytheme, { key = "theme" })
-- get the new texture file assigned to the texture with id 'theme'
print(go.get("#gui", "textures", { key = "theme" })) -- /assets/mytheme.atlas
end
Дерево ресурсів у грі на Defold статичне, тому всі залежності, потрібні для вузлів GUI, необхідно додати до компонента. Панель Outline групує всі залежності за типами в «папках»:

Щоб додати нову залежність, перетягніть її з панелі Asset в область редактора.
Також можна клацнути правою кнопкою миші кореневий вузол “Gui” у панелі Outline, а потім вибрати Add ▸ [type] у контекстному меню.
Крім того, ви можете клацнути правою кнопкою миші піктограму папки потрібного типу та вибрати Add ▸ [type].
Компонент GUI складається з набору вузлів. Вузли — це прості елементи. Їх можна трансформувати (переміщувати, масштабувати й повертати) та впорядковувати в батьківсько-дочірні ієрархії як у редакторі, так і під час виконання за допомогою скриптів. Існують такі типи вузлів:
Щоб додати вузли, клацніть правою кнопкою миші папку Nodes, виберіть Add ▸, а потім Box, Text, Pie, Template або ParticleFx.

Також можна натиснути A і вибрати тип, який потрібно додати до GUI.
Кожен вузол має великий набір властивостей, які керують його виглядом:
Manual, ви зможете змінювати це значення. Розмір визначає межі вузла та використовується під час вибору вузла за координатами введення. Це значення можна анімувати зі скрипту (докладніше).Automatic, редактор задаватиме розмір вузла. Якщо встановлено Manual, ви зможете задавати розмір самостійно.gui.pick_node(). Використовуйте gui.set_enabled() і gui.is_enabled(), щоб програмно змінювати й перевіряти цю властивість.gui.pick_node(). Використовуйте gui.set_visible() і gui.get_visible(), щоб програмно змінювати й перевіряти цю властивість.0 прибирає міжрядковий інтервал. 1 (за замовчуванням) — звичайний міжрядковий інтервал.Alpha змішує значення пікселів вузла й тла з урахуванням альфа. Це відповідає режиму змішування “Normal” у графічних редакторах.Add додає значення пікселів вузла до значень пікселів тла. Це відповідає режиму “Linear dodge” у деяких графічних редакторах.Multiply множить значення пікселів вузла на значення пікселів тла.Screen обернено множить значення пікселів вузла й тла. Це відповідає режиму змішування “Screen” у графічних редакторах.Можливі значення: Center, North, South, East, West, North West, North East, South West або South East.

Якщо змінити опорну точку вузла, вузол переміститься так, щоб нова опорна точка опинилася в позиції вузла. Для текстових вузлів Center задає вирівнювання тексту по центру, West — по лівому краю, а East — по правому краю.

Доступні такі режими прив’язки:
None (для X Anchor і Y Anchor) зберігає позицію вузла відносно центру батьківського вузла або сцени з урахуванням скоригованого розміру.Left або Right (X Anchor) масштабує горизонтальну позицію вузла, щоб зберігати ту саму відсоткову відстань від лівого та правого країв батьківського вузла або сцени.Top або Bottom (Y Anchor) масштабує вертикальну позицію вузла, щоб зберігати ту саму відсоткову відстань від верхнього та нижнього країв батьківського вузла або сцени.
Вузол, створений у сцені з типовою логічною роздільною здатністю в альбомній орієнтації:

Пристосування сцени до екрана в портретній орієнтації розтягує сцену. Обмежувальний прямокутник кожного вузла розтягується так само. Однак налаштування режиму коригування дає змогу зберегти співвідношення сторін вмісту вузла. Доступні такі режими:
Fit масштабує вміст вузла відповідно до ширини або висоти розтягнутого обмежувального прямокутника — залежно від того, яка з них менша. Інакше кажучи, вміст уміщуватиметься всередині розтягнутого обмежувального прямокутника вузла.Zoom масштабує вміст вузла відповідно до ширини або висоти розтягнутого обмежувального прямокутника — залежно від того, яка з них більша. Інакше кажучи, вміст повністю покриватиме розтягнутий обмежувальний прямокутник вузла.Stretch розтягує вміст вузла так, щоб він заповнив розтягнутий обмежувальний прямокутник вузла.
Якщо властивість сцени GUI Adjust Reference має значення Disabled, це налаштування ігнорується.
None відображає вузол як зазвичай.Stencil використовує межі вузла для визначення трафаретної маски, яка обрізає дочірні вузли цього вузла.Докладніше див. у посібнику з обрізання GUI.
Поєднання властивостей Pivot, Anchors і Adjust Mode дає змогу дуже гнучко проєктувати GUI, але без конкретного прикладу може бути складно зрозуміти, як усе це працює. Розгляньмо макет GUI, створений для екрана 640x1136:

Інтерфейс створено зі значенням None для X і Y Anchors, а Adjust Mode кожного вузла залишено зі значенням за замовчуванням Fit. Опорну точку Pivot верхньої панелі встановлено в North, нижньої панелі — у South, а смуг у верхній панелі — у West. Решта вузлів мають опорну точку Center. Ось що станеться, якщо розширити вікно:

А що, як ми хочемо, щоб верхня й нижня панелі завжди мали ширину екрана? Можна змінити Adjust Mode сірих фонових панелей угорі та внизу на Stretch:

Так краще. Сірі фонові панелі тепер завжди розтягуватимуться на всю ширину вікна, але смуги у верхній панелі та два прямокутники внизу розташовані неправильно. Якщо ми хочемо, щоб смуги вгорі залишалися ліворуч, потрібно змінити X Anchor з None на Left:

Саме цього ми й хотіли для верхньої панелі. Опорні точки Pivot смуг у верхній панелі вже мали значення West, тому смуги розташовуватимуться належним чином: їхній лівий, або західний, край (Pivot) буде прив’язаний до лівого краю батьківської панелі (X Anchor).
Тепер, якщо встановити X Anchor у Left для лівого прямокутника, а X Anchor у Right для правого, отримаємо такий результат:

Це не зовсім очікуваний результат. Два прямокутники мали б залишатися так само близько до лівого й правого країв, як дві смуги у верхній панелі. Причина в тому, що опорну точку Pivot задано неправильно:

Обидва прямокутники мають опорну точку Pivot зі значенням Center. Це означає, що коли екран стає ширшим, центральна точка (опорна точка) прямокутників залишається на тій самій відносній відстані від країв. Для лівого прямокутника в початковому вікні 640x1136 ця відстань становила 17% від лівого краю:

Коли розмір екрана змінюється, центральна точка лівого прямокутника залишається на тій самій відстані — 17% від лівого краю:

Якщо змінити опорну точку Pivot з Center на West для лівого прямокутника та на East для правого, а потім перемістити прямокутники, ми отримаємо бажаний результат навіть після змінення розміру екрана:

Усі вузли відображаються в тому порядку, у якому вони перелічені в папці “Nodes”. Вузол угорі списку малюється першим і тому буде позаду всіх інших вузлів. Останній вузол у списку малюється останнім, тобто буде попереду всіх інших вузлів. Змінення значення Z вузла не керує порядком його малювання; однак якщо задати Z поза діапазоном рендерингу вашого скрипту рендерингу, вузол більше не відображатиметься на екрані. Ви можете перевизначити порядок вузлів за індексами за допомогою шарів (див. нижче).

Виберіть вузол і натисніть Alt + Up/Down, щоб перемістити його вгору або вниз і змінити його місце в порядку індексів.
Порядок малювання можна змінити зі скрипту:
local bean_node = gui.get_node("bean")
local shield_node = gui.get_node("shield")
if gui.get_index(shield_node) < gui.get_index(bean_node) then
gui.move_above(shield_node, bean_node)
end
Щоб зробити вузол дочірнім до іншого вузла, перетягніть його на вузол, який має стати батьківським. Дочірній вузол успадковує трансформацію (позицію, поворот і масштаб), застосовану до батьківського вузла, відносно опорної точки батьківського вузла.

Батьківські вузли малюються перед дочірніми. Використовуйте шари, щоб змінювати порядок малювання батьківських і дочірніх вузлів та оптимізувати рендеринг вузлів (див. нижче).
Шари дають змогу точно керувати малюванням вузлів і зменшувати кількість викликів малювання, які рушій має створити для відображення сцени GUI. Коли рушій готується малювати вузли сцени GUI, він групує їх у пакети викликів малювання за такими умовами:
Якщо вузол відрізняється від попереднього за будь-яким із цих пунктів, він розриває пакет і створює ще один виклик малювання. Вузли обрізання завжди розривають пакет, як і кожна область дії трафарету.
Можливість організовувати вузли в ієрархії спрощує їх групування в зручні для керування одиниці. Але ієрархії можуть порушувати пакетний рендеринг, якщо змішувати різні типи вузлів:

Коли конвеєр рендерингу проходить список вузлів, він змушений створювати окремий пакет для кожного вузла, оскільки їхні типи різняться. Загалом для цих трьох кнопок знадобиться шість викликів малювання.
Призначивши вузлам шари, можна впорядкувати їх інакше, щоб конвеєр рендерингу міг згрупувати вузли в меншу кількість викликів малювання. Спочатку додайте до сцени потрібні шари. Клацніть правою кнопкою миші піктограму папки “Layers” у панелі Outline та виберіть Add ▸ Layer. Виберіть новий шар і задайте йому властивість Name у панелі Properties.

Потім задайте властивість Layer кожного вузла відповідно до потрібного шару. Порядок малювання шарів має пріоритет над звичайним порядком вузлів за індексами, тому якщо призначити вузлам Box із графікою кнопок шар “graphics”, а текстовим вузлам кнопок — шар “text”, порядок малювання буде таким:
Спочатку всі вузли шару “graphics”, згори вниз:
Потім усі вузли шару “text”, згори вниз:
Тепер вузли можна згрупувати у два виклики малювання замість шести. Це суттєво підвищує продуктивність!
Зауважте, що дочірній вузол без заданого шару неявно успадковує налаштування шару батьківського вузла. Якщо шару для вузла не задано, він неявно додається до шару “null”, який малюється перед усіма іншими шарами.