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 містить вбудований налагоджувач Lua з можливістю інспектування. Разом із вбудованими інструментами профілювання це потужний засіб, що допомагає знаходити причини помилок в ігровій логіці або аналізувати проблеми продуктивності.
Найпростіший спосіб налагоджувати гру в Defold — налагодження за допомогою виведення. Використовуйте виклики print() або pprint(), щоб спостерігати за змінними або відстежувати хід виконання. Якщо ігровий об’єкт (game object) без скрипту поводиться дивно, до нього можна додати скрипт лише для налагодження. Усі функції виведення надсилають текст на панель Console у редакторі та до журналу гри.
Крім виведення тексту, рушій також може малювати на екрані налагоджувальний текст і прямі лінії. Для цього надсилайте повідомлення до сокета @render:
-- Draw value of "my_val" with debug text on the screen
msg.post("@render:", "draw_text", { text = "My value: " .. my_val, position = vmath.vector3(200, 200, 0) })
-- Draw colored text on the screen
local color_green = vmath.vector4(0, 1, 0, 1)
msg.post("@render:", "draw_debug_text", { text = "Custom color", position = vmath.vector3(200, 180, 0), color = color_green })
-- Draw debug line between player and enemy on the screen
local start_p = go.get_position("player")
local end_p = go.get_position("enemy")
local color_red = vmath.vector4(1, 0, 0, 1)
msg.post("@render:", "draw_line", { start_point = start_p, end_point = end_p, color = color_red })
Повідомлення для візуального налагодження додають дані до конвеєра рендерингу, і ці дані відображаються в межах звичайного конвеєра рендерингу.
"draw_line" додає дані, які відображаються за допомогою функції render.draw_debug3d() у скрипті рендерингу."draw_text" відображається шрифтом /builtins/fonts/debug/always_on_top.font, який використовує матеріал /builtins/fonts/debug/always_on_top_font.material."draw_debug_text" працює так само, як "draw_text", але текст відображається заданим кольором.Зауважте, що ці дані, найімовірніше, потрібно оновлювати кожного кадру, тому доречно надсилати повідомлення у функції update().
Налагоджувач Lua доступний у нативних налагоджувальних збірках і збірках без графічного інтерфейсу. Використовуйте рушій тієї самої версії Defold, що й редактор. Збірки випуску та вебзбірки не підтримують під’єднання налагоджувача.
Щоб запустити налагоджувач, виберіть Debug ▸ Start/Attach. Ця команда запускає гру з під’єднаним налагоджувачем або під’єднує його до вже запущеної гри. Під час запуску для налагодження редактор встановлює ввімкнені точки зупину до виконання стартових скриптів, тож точку зупину в init() можна задати ще до запуску.
Щоб під’єднатися до пристрою, виберіть його в Project ▸ Targets, а потім виберіть Debug ▸ Start/Attach. Після під’єднання виконання призупиняється на наступному рядку Lua. Редактор автоматично налаштовує з’єднання налагоджувача для підтримуваних локальних і віддалених цілей. Вимоги до з’єднання див. у розділі Віддалені цілі, або дізнайтеся, як під’єднати зовнішній налагоджувач.

Щойно налагоджувач під’єднано, ви можете керувати виконанням гри за допомогою кнопок налагоджувача в консолі або меню Debug:


end під рядком із викликом функції nextspawn():

Покрокове виконання відбувається за рядками вихідного коду Lua. Крок може знову потрапити на той самий рядок, наприклад під час повторення циклу, тому він не завжди переходить до наступного рядка файлу.
nextspawn():


Щоб встановити або видалити точку зупину, натисніть у стовпці безпосередньо праворуч від номерів рядків у редакторі коду. Також можна вибрати в меню Edit ▸ Toggle Breakpoint.
Enabled. Вимкнені точки зупину відображаються порожніми всередині, що вказує на їхній неактивний стан.


Щоб змінити умову точки зупину, натисніть правою кнопкою миші у стовпці безпосередньо праворуч від номерів рядків у редакторі коду або виберіть у меню Edit ▸ Edit Breakpoint.

Значення також можна змінювати через присвоєння, наприклад self.score = 100 у кадрі, де доступний self. Обчислюваний код впливає на стан гри так само, як код, який виконує сама гра.
_G, щоб переглянути глобальні змінні, або таблиці чи self, щоб переглянути їхні поля. Під час крокування, перемикання кадрів або оновлення після обчислення редактор зберігає розгорнуті шляхи, вибір і позицію прокручування, отримуючи актуальні значення.Рушій надає нативний сервер Debug Adapter Protocol (DAP) через TCP. Для зовнішнього клієнта DAP запустіть прослуховувач у нативному налагоджувальному рушії Defold або рушії без графічного інтерфейсу, а потім під’єднайте клієнт до адреси й порту рушія. Редактор автоматично налаштовує прослуховувач, коли ви використовуєте Debug ▸ Start/Attach.
Поточний редактор не може під’єднатися до старіших рушіїв, які підтримують лише MobDebug. У поточних версіях виклик require "builtins.scripts.mobdebug" не потрібен і недоступний.
Спочатку зберіть проєкт. Із каталогу проєкту, що містить build/default/game.projectc, запустіть нативний налагоджувальний рушій із такими перевизначеннями конфігурації під час запуску:
dmengine --config=debugger.enabled=1 \
--config=debugger.port=8172 --config=debugger.wait=1
Під’єднайте клієнт DAP до 127.0.0.1:8172. Рушій чекає, доки клієнт налаштує точки зупину, перш ніж запускати стартові скрипти.
| Налаштування | За замовчуванням | Призначення |
|---|---|---|
debugger.enabled |
0 |
Задайте 1, щоб запустити прослуховувач під час запуску рушія. |
debugger.address |
127.0.0.1 |
Адреса IPv4 для прослуховування. За замовчуванням приймаються з’єднання з того самого комп’ютера. |
debugger.port |
8172 |
Порт TCP для прослуховування. Використовуйте 0, щоб вибрати доступний порт. |
debugger.wait |
0 |
Задайте 1, щоб зачекати налаштування клієнта налагоджувача перед виконанням стартових скриптів. |
Ці значення також можна додати до розділу Debugger у game.project. Редактор налаштовує прослуховувач автоматично для Debug ▸ Start/Attach, тож ручне налаштування потрібне лише тоді, коли ви запускаєте його самостійно.
Журнал рушія повідомляє вибрані адресу й порт. За debugger.wait=0 гра запускається одразу, а під’єднатися можна пізніше. За debugger.wait=1 рушій чекає, доки клієнт завершить налаштування сеансу, зокрема точок зупину. Для локальних запусків налагодження редактор автоматично вибирає доступний порт.
Від’єднання клієнта відновлює виконання й залишає прослуховувач доступним для нового під’єднання. Від’єднання під час очікування стартового налаштування також звільняє рушій. Якщо прослуховувач не вдається запустити, рушій записує помилку в журнал і продовжує запуск; можна повторити спробу з Lua за допомогою debugger.start(0), щоб вибрати доступний порт.
Щоб увімкнути прослуховувач зі скрипту без перезапуску гри:
if debugger then
local port = debugger.start(0)
print("DAP listener port:", port)
end
debugger.start([port [, address]]) одразу повертає порт прослуховування. Функція не чекає клієнта й не призупиняє гру. Якщо аргументи пропущено, використовуються debugger.port і debugger.address; значення 0 вибирає доступний порт. Повторні виклики повертають порт наявного прослуховувача й не змінюють його адресу або порт. Модуль debugger надають нативні налагоджувальні рушії та рушії без графічного інтерфейсу.
Порт має бути цілим числом від 0 до 65535. Передайте nil як перший аргумент, щоб перевизначити лише адресу. Некоректні аргументи або неможливість прив’язати прослуховувач спричиняють помилку Lua.
Для прямого з’єднання з іншого комп’ютера прив’яжіть прослуховувач до інтерфейсу IPv4 пристрою або до 0.0.0.0 (усі інтерфейси IPv4). Наприклад, використовуйте debugger.start(8172, "0.0.0.0") або додайте --config=debugger.address=0.0.0.0 до наведеної вище команди запуску. Під’єднайте клієнт до фактичної IP-адреси пристрою й дозвольте доступ TCP до порту прослуховування. 0.0.0.0 — адреса прив’язки, а не адреса для введення в клієнті.
Редактор Defold автоматично запитує таку віддалену прив’язку й використовує порт 8172 + project.instance_index для віддалених цілей. Він не може виявити динамічно вибраний віддалений порт. Якщо ви вже запустили віддалений прослуховувач на localhost або іншому порту, перезапустіть рушій перед під’єднанням із редактора.
Налагоджувач може виконувати Lua й не має автентифікації. Вмикайте віддалений доступ лише в довіреній мережі розробки.
Використовуйте клієнт, який підтримує пряме під’єднання до сервера DAP через TCP. Налаштуйте зіставлення вихідного коду з папкою, що містить game.project (аргумент під’єднання DAP localRoot). Спочатку запустіть прослуховувач рушія, а потім під’єднайте клієнт.
Установіть розширення Lua Debug (actboy168.lua-debug), відкрийте папку з game.project у VS Code і додайте таку конфігурацію до .vscode/launch.json:
{
"version": "0.2.0",
"configurations": [
{
"name": "Attach to Defold Lua",
"type": "lua",
"request": "attach",
"address": "127.0.0.1:8172",
"debugServer": 8172,
"localRoot": "${workspaceFolder}",
"stopOnEntry": false
}
]
}
Якщо VS Code відкриває файл .script, .gui_script або .render_script як звичайний текст, перед установленням точок зупину виберіть Lua в індикаторі мови на панелі стану.
Установіть точку зупину, наприклад у функції init() скрипту. Запустіть рушій за допомогою наведеної вище команди, а потім виберіть Attach to Defold Lua на панелі Run and Debug у VS Code. За debugger.wait=1 рушій запускає стартові скрипти після того, як клієнт встановить точки зупину. Задайте stopOnEntry значення true, якщо також хочете призупиняти виконання на наступному рядку Lua після під’єднання.
Параметр VS Code debugServer під’єднується безпосередньо до локального прослуховувача TCP рушія. Поле address потрібне конфігурації під’єднання розширення Lua Debug. Якщо змінюєте порт прослуховувача, оновіть обидва поля. localRoot має вказувати на папку проєкту, щоб клієнт міг зіставляти назви вихідних файлів Lua в рушії з вашими файлами.
Для віддаленого рушія перенаправте його порт DAP на localhost і вкажіть перенаправлений порт в обох полях або використовуйте клієнт DAP, який під’єднується безпосередньо до віддаленого вузла.

Коли ви працюєте з багатьма точками зупину в різних скриптах, вкладка Breakpoints дає змогу переглядати всі точки зупину й керувати ними в одному місці.
Для роботи з окремими точками зупину:
Виберіть кілька точок зупину за допомогою Ctrl/Cmd+click або Shift+click, а потім натисніть правою кнопкою миші, щоб виконати групові дії. Ви можете одночасно змінювати умови кількох точок зупину, перемикати їхній активний стан або повністю видаляти їх.
Кнопки на панелі інструментів дають змогу ввімкнути, вимкнути або перемкнути стан усіх точок зупину одночасно. Це зручно, коли ви хочете запустити гру без зупинок, зберігши позиції точок зупину. Також можна видалити всі точки, коли сеанс налагодження завершено.
Lua постачається з бібліотекою налагодження, корисною в деяких ситуаціях, особливо коли потрібно інспектувати внутрішній стан середовища Lua. Докладніше про неї можна прочитати в розділі про бібліотеку налагодження в посібнику Lua.
Якщо виникла помилка або гра поводиться не так, як очікувалося, скористайтеся цим переліком перевірок для налагодження:
Перевірте виведення консолі та переконайтеся, що немає помилок під час виконання.
Додайте виклики print до коду, щоб переконатися, що він справді виконується.
Якщо код не виконується, перевірте, чи зроблено в редакторі всі налаштування, потрібні для його виконання. Чи додано скрипт до правильного ігрового об’єкта? Чи отримав скрипт фокус введення? Чи правильно налаштовано тригери введення? Чи додано код шейдера до матеріалу? Тощо.
Якщо ваш код залежить від значень змінних (наприклад, в умовній конструкції if), виведіть ці значення за допомогою print там, де вони використовуються або перевіряються, або інспектуйте їх за допомогою налагоджувача.
Іноді пошук помилки буває складним і тривалим: доводиться послідовно переглядати код, перевіряти все, звужувати область пошуку несправного коду та усувати джерела помилок. Найкраще для цього підходить метод «розділяй і володарюй»:
Вдалого полювання!
Якщо виникли проблеми з фізикою й колізії працюють не так, як очікувалося, рекомендується ввімкнути налагодження фізики. Установіть прапорець Debug у розділі Physics файлу game.project:

Коли цей прапорець установлено, Defold малюватиме всі форми колізій і точки контакту колізій:
