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
API состоит всего из нескольких функций:
liveupdate.add_mount()liveupdate.remove_mount()liveupdate.get_mounts()Устаревший сценарий Live Update с загрузкой отдельных ресурсов больше не рекомендуется. Не используйте collectionproxy.missing_resources() и старые алиасы-помощники resource.* в новом коде. Современный рабочий процесс Live Update предполагает загрузку и монтирование целых архивов, а при необходимости можно использовать collectionproxy.get_resources(), чтобы определить, какой исключенный контент относится к proxy.
Если вы используете более одного архива Live Update, рекомендуется при запуске перебирать каждый mount и определять, нужно ли его по-прежнему использовать.
Это важно, поскольку контент может больше не подходить для текущей версии движка из-за изменений формата файлов.
local function remove_old_mounts()
local mounts = liveupdate.get_mounts() -- таблица с mount'ами
-- У каждого mount'а есть: mount.uri, mount.priority, mount.name
for _,mount in ipairs(mounts) do
-- Имя файла должно быть уникальным, чтобы мы не получили файл из другого архива
-- Эти данные разработчик создает как способ задать метаданные для архива
local version_data = sys.load_resource("/version_" .. mount.name .. ".json")
if version_data then
version_data = json.decode(version_data)
else
version_data = {version = 0} -- если файла версии нет, скорее всего архив старый или недействительный
end
-- Проверяем версию архива относительно версии, поддерживаемой игрой
if version_data.version < sys.get_config_int("game.minimum_lu_version") then
-- Архив недействителен, поэтому размонтируем его
liveupdate.remove_mount(mount.name)
end
end
end
Collection proxy, исключенный из бандла, работает как обычный collection proxy, но с одним важным отличием. Если отправить ему сообщение load, пока часть его ресурсов недоступна в хранилище бандла, загрузка завершится ошибкой.
В текущем архивном сценарии вы обычно заранее определяете, какой архив или набор архивов нужен proxy, и монтируете их перед загрузкой. Если нужно проверить, есть ли у proxy исключенный контент, используйте collectionproxy.get_resources(). Более старая функция collectionproxy.missing_resources() относится к устаревшему сценарию Live Update с загрузкой отдельных ресурсов.
Если включена опция Strip Live Update Entries from Main Manifest, а именно это значение используется по умолчанию при публикации архивного Live Update, то:
collectionproxy.get_resources("#proxy") возвращает пустую таблицу {};collectionproxy.get_resources("#proxy") возвращает непустую таблицу с хешами ресурсов этого proxy, например:{
"a1b2c3...",
"d4e5f6...",
"7890ab...",
...
}
Следующий пример кода предполагает, что ресурсы доступны по URL, указанному в настройке `game.http_url`.
```lua
-- Нужно отслеживать, какой архив содержит какой контент
-- В этом примере используется только один архив liveupdate, содержащий все отсутствующие ресурсы.
-- Если вы используете несколько архивов, нужно соответствующим образом организовать загрузки
local lu_infos = {
liveupdate = {
name = "liveupdate",
priority = 10,
}
}
local function get_lu_info_for_level(level_name)
if level_name == "level1" then
return lu_infos['liveupdate']
end
end
local function mount_zip(self, name, priority, path, callback)
liveupdate.add_mount(name, "zip:" .. path, priority, function(_uri, _path, _status) -- <1>
callback(_uri, _path, _status)
end)
end
local function has_mount(name)
for _, mount in ipairs(liveupdate.get_mounts()) do
if mount.name == name then
return true
end
end
return false
end
function init(self)
self.http_url = sys.get_config_string("game.http_url", nil) -- <2>
local level_name = "level1"
local info = get_lu_info_for_level(level_name) -- <3>
msg.post("#", "load_level", {level = "level1", info = info }) -- <4>
end
function on_message(self, message_id, message, sender)
if message_id == hash("load_level") then
local proxy_resources = collectionproxy.get_resources("#" .. message.level) -- <5>
-- При включенном Strip Live Update Entries from Main Manifest эта таблица
-- остается пустой, пока нужный архив не будет смонтирован.
-- После монтирования в ней появляются хеши ресурсов proxy.
if message.info and #proxy_resources == 0 and not has_mount(message.info.name) then
msg.post("#", "download_archive", message) -- <6>
else
msg.post("#" .. message.level, "load")
end
elseif message_id == hash("download_archive") then
local zip_filename = message.info.name .. ".zip"
local download_path = sys.get_save_file("mygame", zip_filename)
local url = self.http_url .. "/" .. zip_filename
-- Выполняем запрос. При необходимости можно использовать учетные данные
http.request(url, "GET", function(self, id, response) -- <7>
if response.status == 200 or response.status == 304 then
mount_zip(self, message.info.name, message.info.priority, download_path, function(uri, path, status) -- <8>
msg.post("#", "load_level", message) -- пробуем загрузить уровень снова
end)
else
print("Не удалось скачать архив ", download_path, "из", url, ":", response.status)
end
end, nil, nil, {path=download_path})
elseif message_id == hash("proxy_loaded") then -- уровень загружен, и теперь его можно включить
msg.post(sender, "init")
msg.post(sender, "enable")
end
end
liveupdate.add_mount() монтирует один архив, используя заданные имя, приоритет и zip-файл. После этого данные сразу доступны для загрузки, перезапускать движок не нужно.
Сведения о mount’е сохраняются и будут автоматически добавлены снова при следующем запуске движка, поэтому повторно вызывать liveupdate.add_mount() для того же mount’а не требуется.collectionproxy.get_resources() проверяем исключенный контент proxy. При стандартной настройке stripped-manifest функция возвращает {} до монтирования нужного архива, а после монтирования возвращает непустую таблицу хешей ресурсов proxy.download_path.После того как код загрузки готов, можно протестировать приложение. Однако при запуске из редактора ничего скачиваться не будет. Это происходит потому, что Live Update работает только в собранном бандле. При запуске в среде редактора ресурсы никогда не исключаются. Чтобы убедиться, что все работает корректно, нужно создать бандл.