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 дає змогу виконувати гаряче перезавантаження ресурсів. Під час розробки гри ця функція значно пришвидшує виконання певних завдань. Вона дає змогу змінювати код і вміст гри, поки вона працює. Типові випадки використання:
Запустіть гру з редактора (Project ▸ Build).
Щоб потім перезавантажити оновлений ресурс, просто виберіть пункт меню File ▸ Hot Reload або натисніть відповідне сполучення клавіш:

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

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

Додайте нові кнопки, збережіть файл GUI та виконайте його гаряче перезавантаження. Тепер ви можете побачити нові кнопки на екрані телефона:

Коли ви виконуєте гаряче перезавантаження файлу, рушій виводить у консоль кожен перезавантажений файл ресурсу.
Будь-який перезавантажений файл скрипту Lua виконується повторно в поточному середовищі Lua.
local my_value = 10
function update(self, dt)
print(my_value)
end
Зміна my_value на 11 і гаряче перезавантаження файлу одразу дадуть результат:
...
DEBUG:SCRIPT: 10
DEBUG:SCRIPT: 10
DEBUG:SCRIPT: 10
INFO:RESOURCE: /main/hunter.scriptc was successfully reloaded.
DEBUG:SCRIPT: 11
DEBUG:SCRIPT: 11
DEBUG:SCRIPT: 11
...
Зауважте, що гаряче перезавантаження не змінює перебіг виконання функцій життєвого циклу. Наприклад, під час гарячого перезавантаження функція init() не викликається. Однак якщо ви перевизначите функції життєвого циклу, використовуватимуться їхні нові версії.
Якщо ви додаєте змінні до глобальної області видимості у файлі модуля, перезавантаження файлу змінить ці глобальні змінні:
--- my_module.lua
my_module = {}
my_module.val = 10
-- user.script
require "my_module"
function update(self, dt)
print(my_module.val) -- hot reload "my_module.lua" and the new value will print
end
Поширений підхід до написання модулів Lua — створити локальну таблицю, заповнити її та повернути:
--- my_module.lua
local M = {} -- a new table object is created here
M.val = 10
return M
-- user.script
local mm = require "my_module"
function update(self, dt)
print(mm.val) -- will print 10 even if you change and hot reload "my_module.lua"
end
Зміна й перезавантаження my_module.lua не змінять поведінку user.script. Докладніше про причини цього та способи уникнути такої проблеми див. у посібнику з модулів.
Кожен компонент-скрипт (script component) може визначати функцію on_reload(). Якщо вона існує, її викликатимуть щоразу, коли скрипт перезавантажується. Це корисно для інспектування або змінення даних, надсилання повідомлень тощо:
function on_reload(self)
print(self.velocity)
msg.post("/level#controller", "setup")
end
Під час перезавантаження вершинних і фрагментних шейдерів графічний драйвер повторно компілює код GLSL і завантажує його на GPU. Якщо код шейдера спричинить аварійне завершення, що легко може статися, оскільки код GLSL пишуть на дуже низькому рівні, це також призведе до аварійного завершення рушія.