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.
  • Редагування й налаштування графічних елементів (наприклад, ефектів частинок або елементів GUI) та перегляд результатів у відповідному контексті.
  • Редагування й налаштування коду шейдерів та перегляд результатів у відповідному контексті.
  • Спрощення тестування гри через перезапуск рівнів, встановлення стану тощо — без зупинення гри.

Як виконати гаряче перезавантаження

Запустіть гру з редактора (Project ▸ Build).

Щоб потім перезавантажити оновлений ресурс, просто виберіть пункт меню File ▸ Hot Reload або натисніть відповідне сполучення клавіш:

Перезавантаження ресурсів

Гаряче перезавантаження на пристрої

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

Цільовий пристрій

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

Наприклад, щоб додати кілька кнопок до GUI, що відображається в запущеній грі на телефоні, просто відкрийте файл GUI:

Перезавантаження 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() не викликається. Однак якщо ви перевизначите функції життєвого циклу, використовуватимуться їхні нові версії.

Перезавантаження модулів Lua

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

--- 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. Докладніше про причини цього та способи уникнути такої проблеми див. у посібнику з модулів.

Функція on_reload()

Кожен компонент-скрипт (script component) може визначати функцію on_reload(). Якщо вона існує, її викликатимуть щоразу, коли скрипт перезавантажується. Це корисно для інспектування або змінення даних, надсилання повідомлень тощо:

function on_reload(self)
    print(self.velocity)

    msg.post("/level#controller", "setup")
end

Перезавантаження коду шейдерів

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