Read this manual in English

Перезагрузка ресурсов на лету

Defold позволяет выполнять горячую перезагрузку ресурсов. При разработке игры эта функция помогает значительно ускорить выполнение определенных задач. Она позволяет вам изменять код и содержимое игры во время ее работы. Типовые варианты использования:

  • Для настройки параметров игрового процесса в Lua-скриптах.
  • Для редактирования и настройки графических элементов (например, эффектов частиц или элементов графического интерфейса) и просмотра результатов в актуальном контексте.
  • Для редактирования и настройки кода шейдера и просмотра результатов в актуальном контексте.
  • Для облегчения тестирования игры путем перезапуска уровней, настройки состояния и т. д. без остановки игры.

Как сделать горячую перезагрузку

Запустите свою игру из редактора (Project ▸ Build).

Чтобы затем перезагрузить обновленный ресурс, просто выберите пункт меню File ▸ Hot Reload или нажмите соответствующую комбинацию на клавиатуре:

Reloading resources

Горячая перезагрузка на устройстве

Горячая перезагрузка работает как на устройстве, так и на компьютере. Чтобы использовать её на устройстве, запустите отладочную сборку своей игры или приложение для разработки на своем мобильном устройстве, затем выберите его в качестве цели в редакторе:

target device

Теперь при сборке и запуске редактор загружает все ассеты в работающее приложение на устройстве и запускает игру. После этого любой файл, который вы загружаете в горячем режиме, будет обновлен на устройстве.

Например, чтобы добавить пару кнопок в графический интерфейс, который отображается в запущенной игре на вашем телефоне, просто откройте файл графического интерфейса:

reload gui

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

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

Каждый компонент скрипта может содержать определение функции on_reload(). Если она существует, она будет вызываться каждый раз при перезагрузке скрипта. Это полезно для проверки или изменения данных, отправки сообщений и так далее:

function on_reload(self)
    print(self.velocity)

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

Перезагрузка кода шейдера

При перезагрузке вершинных и фрагментных шейдеров код GLSL перекомпилируется графическим драйвером и загружается в GPU. Если код шейдера вызывает сбой, что легко сделать, поскольку GLSL написан на очень низком уровне, это приведет к остановке движка.