Defold позволяет выполнять горячую перезагрузку ресурсов. При разработке игры эта функция помогает значительно ускорить выполнение определенных задач. Она позволяет вам изменять код и содержимое игры во время ее работы. Типовые варианты использования:
Запустите свою игру из редактора (Project ▸ Build).
Чтобы затем перезагрузить обновленный ресурс, просто выберите пункт меню File ▸ Hot Reload или нажмите соответствующую комбинацию на клавиатуре:
Горячая перезагрузка работает как на устройстве, так и на компьютере. Чтобы использовать её на устройстве, запустите отладочную сборку своей игры или приложение для разработки на своем мобильном устройстве, затем выберите его в качестве цели в редакторе:
Теперь при сборке и запуске редактор загружает все ассеты в работающее приложение на устройстве и запускает игру. После этого любой файл, который вы загружаете в горячем режиме, будет обновлен на устройстве.
Например, чтобы добавить пару кнопок в графический интерфейс, который отображается в запущенной игре на вашем телефоне, просто откройте файл графического интерфейса:
Добавьте новые кнопки, сохраните и перезагрузите 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”. См. Руководство по модулям для получения дополнительной информации о том, почему и как избежать этой ошибки.
Каждый компонент скрипта может содержать определение функции on_reload()
. Если она существует, она будет вызываться каждый раз при перезагрузке скрипта. Это полезно для проверки или изменения данных, отправки сообщений и так далее:
function on_reload(self)
print(self.velocity)
msg.post("/level#controller", "setup")
end
При перезагрузке вершинных и фрагментных шейдеров код GLSL перекомпилируется графическим драйвером и загружается в GPU. Если код шейдера вызывает сбой, что легко сделать, поскольку GLSL написан на очень низком уровне, это приведет к остановке движка.
Did you spot an error or do you have a suggestion? Please let us know on GitHub!
GITHUB