Страница 1 из 2

Работа с AssetBundle.

СообщениеДобавлено: 19 авг 2022, 04:21
Jags
Решил поработать с AssetBundle, появилось несколько вопросов. Решил всю игру упаковать в AssetBundle по частям.

К примеру, - первый AssetBundle содержит в себе набор сцен. Загружаю их через LoadFromMemory, использую GetAllScenePaths(); для получения ссылок на сцены, работает нормально. Если перед загрузкой сцены их выгрузить из памяти - не работает(логично, грузить нечего).

Второй AssetBundle содержит в себе набор картинок. Делаю всё тоже самое, картинки загружаю в массив спрайтов, выгружаю из памяти AssetBundle , но при этом могу обратиться к массиву со спрайтами и выводить их на экран.

Вопрос: почему можно обратиться к спрайтам из массива, если AssetBundle был выгружен из памяти?

Re: Работа с AssetBundle.

СообщениеДобавлено: 19 авг 2022, 13:02
Saltant
Используй Addresables, там таких проблем у тебя не будет возникать.

Re: Работа с AssetBundle.

СообщениеДобавлено: 20 авг 2022, 10:14
Jarico
Jags писал(а): Загружаю их через LoadFromMemory

Если шифруешь бандлы можно использовать LoadFromStreamAsync но перед вызовом этой функции нужно сделать дешифровку и потом уже вызывать т.к. в доках написано что указатель должен быть равен 0

Jags писал(а): для получения ссылок на сцены, работает нормально. Если перед загрузкой сцены их выгрузить из памяти - не работает(логично, грузить нечего).

В том и дело что сцены не являются ссылками (являются непосредственной самой сценой), при загрузке бандла со сценами вся инфа о сценах хранится в SceneManager (какой путь сцены, какой бандл), если выгрузить бандл со сценами то SceneManager просто не найдёт её

Jags писал(а):Вопрос: почему можно обратиться к спрайтам из массива, если AssetBundle был выгружен из памяти?

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

Re: Работа с AssetBundle.

СообщениеДобавлено: 24 авг 2022, 10:15
Jags
Jarico писал(а):
Jags писал(а): Загружаю их через LoadFromMemory

Если шифруешь бандлы можно использовать LoadFromStreamAsync но перед вызовом этой функции нужно сделать дешифровку и потом уже вызывать т.к. в доках написано что указатель должен быть равен 0

Jags писал(а): для получения ссылок на сцены, работает нормально. Если перед загрузкой сцены их выгрузить из памяти - не работает(логично, грузить нечего).

В том и дело что сцены не являются ссылками (являются непосредственной самой сценой), при загрузке бандла со сценами вся инфа о сценах хранится в SceneManager (какой путь сцены, какой бандл), если выгрузить бандл со сценами то SceneManager просто не найдёт её

Jags писал(а):Вопрос: почему можно обратиться к спрайтам из массива, если AssetBundle был выгружен из памяти?

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


Вроде сам разобрался, но спасибо за ответ. Если не ошибаюсь, LoadFromStreamAsync тоже ведь память нагружает?

Re: Работа с AssetBundle.

СообщениеДобавлено: 24 авг 2022, 10:42
Jarico
Jags писал(а):LoadFromStreamAsync тоже ведь память нагружает?

LoadFromMemory принимает массив байт, а массив байт всегда в памяти процесса
LoadFromStream загружает данные из потока данных (FileStream и т.д.), стрим может быть открыт как из накопителя так и из памяти процесса

Re: Работа с AssetBundle.

СообщениеДобавлено: 25 авг 2022, 11:28
Jags
Jarico писал(а):
Jags писал(а):LoadFromStreamAsync тоже ведь память нагружает?

LoadFromMemory принимает массив байт, а массив байт всегда в памяти процесса
LoadFromStream загружает данные из потока данных (FileStream и т.д.), стрим может быть открыт как из накопителя так и из памяти процесса


Подскажи, как бандлы работают, ибо понять не могу. К примеру, гружу бандлы из файла, сцены, картинки и т.д. Массивы заполняются, всё ок. Но, если мне нужно перейти на сцену, а делаю я это после загрузки бандла со сценами - выдет ошибку(пути с ценами есть, Unload(false)). Такой сцены нет в бандле/Сцены нет в настройках сборки. Так же решил сделать публичные переменные AssetBundle, после загрузки пишет - ассет бандл отсутствует.

Если не ошибаюсь, если грузить сцены в память, то такой байды нет. Можешь их вызывать когда захочешь.

Re: Работа с AssetBundle.

СообщениеДобавлено: 25 авг 2022, 11:51
Jags
А, дошло вроде(не могу прочитать документацию в данный момент). Получается, если грузить бандл из файла, то он его открывает, читает, закрывает. Соответственно, .Unload() - работает только с памятью, как я понял. Соответственно, чтобы перейти на другую сцену, мне нужно вызывать функцию с чтением бандла, которая содержит сцены, в ней же переходить на нужную сцену...

Re: Работа с AssetBundle.

СообщениеДобавлено: 25 авг 2022, 15:13
Jarico
Не знаю с какими ты там массивами работаешь, но я бандлы использую так:
У меня есть префаб ClientUI (меню, HUD и прочая дичь), для него отдельный бандл (чисто для префаба) и есть другие бандлы ui_materials ui_textures ui_shaders и т.д.
Чтобы ClientUI нормально загрузился (без потерь ссылок на ресурсы) нужно загрузить все бандлы (можно беспорядочно) которые имеют отношение к бандлу префаба а затем делать Instantiate, т.к. если сделать наоборот двиг при клонировании префаба на сцену не применяет ресурсы автоматически и будут потерянные ссылки

Re: Работа с AssetBundle.

СообщениеДобавлено: 26 авг 2022, 13:06
Jags
Jarico писал(а):Не знаю с какими ты там массивами работаешь, но я бандлы использую так:
У меня есть префаб ClientUI (меню, HUD и прочая дичь), для него отдельный бандл (чисто для префаба) и есть другие бандлы ui_materials ui_textures ui_shaders и т.д.
Чтобы ClientUI нормально загрузился (без потерь ссылок на ресурсы) нужно загрузить все бандлы (можно беспорядочно) которые имеют отношение к бандлу префаба а затем делать Instantiate, т.к. если сделать наоборот двиг при клонировании префаба на сцену не применяет ресурсы автоматически и будут потерянные ссылки


Сцены, изображения, звук, текст - раскинул по отдельным бандлам. В Awake я их распаковываю, звук уходит в AudioClip[], изображения в Sprite[] и т.д. Просто объект не удаляю при переходе и обращаюсь к нему из других скриптов. Я вот что заметил: если есть приписка .Unload(false) в LoadFromFile - он теряет связь с бандлом. Ссылки на сцены есть, но загрузиться нельзя. Если убираем .Unload(false) - работает нормально. Так вроде разобрался, просто офф. документацию тогда прочитать не мог..

Re: Работа с AssetBundle.

СообщениеДобавлено: 26 авг 2022, 14:26
Jarico
Jags писал(а): Ссылки на сцены есть, но загрузиться нельзя. Если убираем .Unload(false) - работает нормально. Так вроде разобрался, просто офф. документацию тогда прочитать не мог..


Я же писал что сцены не имеют ссылок, только инфу т.к. являются не бандлами а сценами
Даже можно проверить является ли бандл сценой, у бандлов содержащие сцену(ы) есть параметр isStreamedSceneAssetBundle

Re: Работа с AssetBundle.

СообщениеДобавлено: 20 сен 2022, 00:21
Jags
Jarico писал(а):
Jags писал(а): Ссылки на сцены есть, но загрузиться нельзя. Если убираем .Unload(false) - работает нормально. Так вроде разобрался, просто офф. документацию тогда прочитать не мог..


Синтаксис:
Используется csharp
AssetBundleCreateRequest FileAssetBundleCreateRequest = AssetBundle.LoadFromMemoryAsync(data_bytes);
            while (!FileAssetBundleCreateRequest.isDone)
            {
                progress.text = "Loading progress: " + (FileAssetBundleCreateRequest.progress * 100) + "%";
                Debug.Log("Progress: " + FileAssetBundleCreateRequest.progress + "%");
                yield return null;
            }

            yield return FileAssetBundleCreateRequest;


Есть маленький вопрос. Как можно вывести прогресс загрузки бандла? Условно, код выше не работает. Точнее, показывает 0%, а по окончанию сразу 90% и всё. Можно это сделать как то плавно?

Re: Работа с AssetBundle.

СообщениеДобавлено: 20 сен 2022, 00:44
1max1
Jags писал(а):Есть маленький вопрос. Как можно вывести прогресс загрузки бандла? Условно, код выше не работает. Точнее, показывает 0%, а по окончанию сразу 90% и всё. Можно это сделать как то плавно?

Видимо очень быстро загружает))

Re: Работа с AssetBundle.

СообщениеДобавлено: 20 сен 2022, 11:19
Jags
1max1 писал(а):
Jags писал(а):Есть маленький вопрос. Как можно вывести прогресс загрузки бандла? Условно, код выше не работает. Точнее, показывает 0%, а по окончанию сразу 90% и всё. Можно это сделать как то плавно?

Видимо очень быстро загружает))

Это функция разве не работает только для скачивания бандла? Не совсем понял по документации. Сам бандл нагружен, распаковывает около 15 секунд....

Re: Работа с AssetBundle.

СообщениеДобавлено: 23 сен 2022, 12:31
Jags
Выше я ошибся. Так никто не знает в чем проблема? Ибо я нашел на англоязычных форумах такие же вопросы. Если грузить LoadFromFileAsync - работает как надо, если начинаешь грузить с LoadFromMemoryAsync - показывает в конце 0.9 и всё. Тут явно дело не в весе бандла и его сжатии.

Re: Работа с AssetBundle.

СообщениеДобавлено: 23 сен 2022, 17:35
Saltant
Выводи прогресс по количеству загруженных бандлов, так оно правильней.
Типа "Загрузка текстур 1/1000" и т.д