Manuals
Manuals




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().

Запуск налагоджувача

Щоб запустити налагоджувач, виберіть Debug ▸ Start/Attach: ця команда запускає гру з під’єднаним налагоджувачем або під’єднує налагоджувач до вже запущеної гри.

загальний вигляд

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

Break
Негайно призупиніть виконання гри. Гра зупиниться в поточній точці виконання. Тепер ви можете інспектувати стан гри, виконувати її покроково або продовжити виконання до наступної точки зупину. Поточну точку виконання позначено в редакторі коду:

скрипт

Continue
Продовжіть виконання гри. Код гри виконуватиметься, доки ви не натиснете кнопку паузи або виконання не дійде до встановленої вами точки зупину. Якщо виконання призупиниться на встановленій точці зупину, поточну точку виконання буде позначено в редакторі коду поверх маркера точки зупину:

зупинка

Stop
Зупиніть налагоджувач. Натискання цієї кнопки негайно зупинить налагоджувач, від’єднає його від гри та завершить запущену гру.
Step Over
Виконайте один крок програми. Якщо цей крок передбачає виклик іншої функції Lua, виконання не перейде всередину функції, а продовжиться й зупиниться на наступному рядку після виклику функції. У цьому прикладі, якщо користувач натисне «step over», налагоджувач виконає код і зупиниться на інструкції end під рядком із викликом функції nextspawn():

крок

Один рядок коду Lua не обов’язково відповідає одному виразу. Під час покрокового виконання налагоджувач переходить на один вираз уперед, тому наразі для переходу до наступного рядка може знадобитися натиснути кнопку кроку кілька разів.

Step Into
Виконайте один крок програми. Якщо цей крок передбачає виклик іншої функції Lua, виконання перейде всередину функції. Виклик функції додає запис до стека викликів. Ви можете натиснути будь-який запис у списку стека викликів, щоб переглянути точку входу та значення всіх змінних у відповідному замиканні. Тут користувач перейшов усередину функції nextspawn():

крок із входом

Step Out
Продовжіть виконання до повернення з поточної функції. Якщо ви перейшли всередину функції під час покрокового виконання, натискання кнопки «step out» продовжить виконання до повернення з цієї функції.
Встановлення й видалення точок зупину
Ви можете встановити довільну кількість точок зупину у своєму коді Lua. Коли гра працює з під’єднаним налагоджувачем, вона призупинить виконання на наступній точці зупину, якої досягне, і чекатиме на ваші подальші дії.

додавання точки зупину

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

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

вимкнення точки зупину

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

редагування точки зупину

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

Обчислення виразів Lua
Коли налагоджувач під’єднано, а гру призупинено на точці зупину, доступне середовище виконання Lua з поточним контекстом. Вводьте вирази Lua внизу консолі та натискайте Enter, щоб обчислити їх:

консоль

Наразі змінювати змінні за допомогою засобу обчислення виразів неможливо.

Від’єднання налагоджувача
Виберіть Debug ▸ Detach Debugger, щоб від’єднати налагоджувач від гри. Гра негайно продовжить виконання.

Вкладка Breakpoints

вкладка точок зупину

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

Керування окремими точками зупину

Для роботи з окремими точками зупину:

  • Натисніть червону піктограму кошика, щоб видалити точку зупину
  • Двічі натисніть рядок (поза областю умови), щоб перейти до відповідного рядка коду в Code View
  • Двічі натисніть комірку умови або натисніть піктограму пера, щоб змінити умовну точку зупину
  • Наведіть вказівник на комірку умови та натисніть кнопку очищення X, щоб видалити умову
Групові операції

Виберіть кілька точок зупину за допомогою Ctrl/Cmd+click або Shift+click, а потім натисніть правою кнопкою миші, щоб виконати групові дії. Ви можете одночасно змінювати умови кількох точок зупину, перемикати їхній активний стан або повністю видаляти їх.

Кнопки на панелі інструментів дають змогу ввімкнути, вимкнути або перемкнути стан усіх точок зупину одночасно. Це зручно, коли ви хочете запустити гру без зупинок, зберігши позиції точок зупину. Також можна видалити всі точки, коли сеанс налагодження завершено.

Бібліотека налагодження Lua

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

Перелік перевірок для налагодження

Якщо виникла помилка або гра поводиться не так, як очікувалося, скористайтеся цим переліком перевірок для налагодження:

  1. Перевірте виведення консолі та переконайтеся, що немає помилок під час виконання.

  2. Додайте виклики print до коду, щоб переконатися, що він справді виконується.

  3. Якщо код не виконується, перевірте, чи зроблено в редакторі всі налаштування, потрібні для його виконання. Чи додано скрипт до правильного ігрового об’єкта? Чи отримав скрипт фокус введення? Чи правильно налаштовано тригери введення? Чи додано код шейдера до матеріалу? Тощо.

  4. Якщо ваш код залежить від значень змінних (наприклад, в умовній конструкції if), виведіть ці значення за допомогою print там, де вони використовуються або перевіряються, або інспектуйте їх за допомогою налагоджувача.

Іноді пошук помилки буває складним і тривалим: доводиться послідовно переглядати код, перевіряти все, звужувати область пошуку несправного коду та усувати джерела помилок. Найкраще для цього підходить метод «розділяй і володарюй»:

  1. Визначте, яка половина коду (або менша частина) має містити помилку.
  2. Знову визначте, яка половина цієї половини має містити помилку.
  3. Продовжуйте звужувати область коду, що має спричиняти помилку, доки не знайдете її.

Вдалого полювання!

Налагодження проблем із фізикою

Якщо виникли проблеми з фізикою й колізії працюють не так, як очікувалося, рекомендується ввімкнути налагодження фізики. Установіть прапорець Debug у розділі Physics файлу game.project:

налаштування налагодження фізики

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

візуалізація налагодження фізики