--- title: Горячая перезагрузка brief: В этом руководстве объясняется функция горячей перезагрузки (перезагрузки на лету) в Defold. --- # Перезагрузка ресурсов на лету Defold позволяет выполнять горячую перезагрузку ресурсов. При разработке игры эта функция помогает значительно ускорить выполнение определенных задач. Она позволяет вам изменять код и содержимое игры во время ее работы. Типовые варианты использования: - Для настройки параметров игрового процесса в Lua-скриптах. - Для редактирования и настройки графических элементов (например, эффектов частиц или элементов графического интерфейса) и просмотра результатов в актуальном контексте. - Для редактирования и настройки кода шейдера и просмотра результатов в актуальном контексте. - Для облегчения тестирования игры путем перезапуска уровней, настройки состояния и т. д. без остановки игры. ## Как сделать горячую перезагрузку Запустите свою игру из редактора (Project ▸ Build). Чтобы затем перезагрузить обновленный ресурс, просто выберите пункт меню File ▸ Hot Reload или нажмите соответствующую комбинацию на клавиатуре: ![Reloading resources](images/hot-reload/menu.png) ## Горячая перезагрузка на устройстве Горячая перезагрузка работает как на устройстве, так и на компьютере. Чтобы использовать её на устройстве, запустите отладочную сборку своей игры или [приложение для разработки](/manuals/dev-app) на своем мобильном устройстве, затем выберите его в качестве цели в редакторе: ![target device](images/hot-reload/target.png) Теперь при сборке и запуске редактор загружает все ассеты в работающее приложение на устройстве и запускает игру. После этого любой файл, который вы загружаете в горячем режиме, будет обновлен на устройстве. Например, чтобы добавить пару кнопок в графический интерфейс, который отображается в запущенной игре на вашем телефоне, просто откройте файл графического интерфейса: ![reload gui](images/hot-reload/gui.png) Добавьте новые кнопки, сохраните и перезагрузите GUI-файл в горячем режиме. Теперь вы можете видеть новые кнопки на экране телефона: ![reloaded gui](images/hot-reload/gui-reloaded.png) При горячей перезагрузке файла движок выведет в консоль каждый перезагруженный файл ресурсов. ## Перезагрузка скриптов Любой перезагруженный файл Lua-скрипта будет повторно выполнен в среде исполнения Lua. ```lua local my_value = 10 function update(self, dt) print(my_value) end ``` Изменение `my_value` на 11 и горячая перезагрузка файла дадут немедленный эффект: ```text ... 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 модулей Пока вы добавляете переменные в глобальную область видимости в файле модуля, перезагрузка файла приведет к изменению этих глобальных переменных: ```lua --- my_module.lua my_module = {} my_module.val = 10 ``` ```lua -- 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 - создать локальную таблицу, заполнить ее и затем вернуть: ```lua --- my_module.lua local M = {} -- a new table object is created here M.val = 10 return M ``` ```lua -- 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". См. [Руководство по модулям](/manuals/modules) для получения дополнительной информации о том, почему и как избежать этой ошибки. ## Функция on_reload() Каждый компонент скрипта может содержать определение функции `on_reload()`. Если она существует, она будет вызываться каждый раз при перезагрузке скрипта. Это полезно для проверки или изменения данных, отправки сообщений и так далее: ```lua function on_reload(self) print(self.velocity) msg.post("/level#controller", "setup") end ``` ## Перезагрузка кода шейдера При перезагрузке вершинных и фрагментных шейдеров код GLSL перекомпилируется графическим драйвером и загружается в GPU. Если код шейдера вызывает сбой, что легко сделать, поскольку GLSL написан на очень низком уровне, это приведет к остановке движка.