Работа с AssetBundle.

Общие вопросы о Unity3D

Работа с AssetBundle.

Сообщение Jags 19 авг 2022, 04:21

Решил поработать с AssetBundle, появилось несколько вопросов. Решил всю игру упаковать в AssetBundle по частям.

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

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

Вопрос: почему можно обратиться к спрайтам из массива, если AssetBundle был выгружен из памяти?
Jags
UNец
 
Сообщения: 24
Зарегистрирован: 23 июн 2022, 23:11

Re: Работа с AssetBundle.

Сообщение Saltant 19 авг 2022, 13:02

Используй Addresables, там таких проблем у тебя не будет возникать.
Я на Google Play _https://play.google.com/store/apps/developer?id=Saltant
Аватара пользователя
Saltant
Адепт
 
Сообщения: 2234
Зарегистрирован: 09 окт 2018, 16:40
Откуда: Химки
  • Сайт

Re: Работа с AssetBundle.

Сообщение Jarico 20 авг 2022, 10:14

Jags писал(а): Загружаю их через LoadFromMemory

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

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

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

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

Потому функция AssetBundle.Unload имеет параметр который указывает системе выгружать все загруженные ресурсы этого бандла или нет, если не выгружать ресурсы и выгрузить только бандл ресурсы будут висеть в памяти
Github: _https://github.com/redheadgektor
Discord: Конь! Чаю!#9382 (сижу редко)
YouTube: _https://www.youtube.com/channel/UCPQ04Xpbbw2uGc1gsZtO3HQ
Telegram: _https://t.me/redheadgektor
Аватара пользователя
Jarico
Адепт
 
Сообщения: 1084
Зарегистрирован: 06 янв 2019, 17:37
Откуда: 0xDEAD
Skype: none
  • Сайт

Re: Работа с AssetBundle.

Сообщение Jags 24 авг 2022, 10:15

Jarico писал(а):
Jags писал(а): Загружаю их через LoadFromMemory

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

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

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

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

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


Вроде сам разобрался, но спасибо за ответ. Если не ошибаюсь, LoadFromStreamAsync тоже ведь память нагружает?
Jags
UNец
 
Сообщения: 24
Зарегистрирован: 23 июн 2022, 23:11

Re: Работа с AssetBundle.

Сообщение Jarico 24 авг 2022, 10:42

Jags писал(а):LoadFromStreamAsync тоже ведь память нагружает?

LoadFromMemory принимает массив байт, а массив байт всегда в памяти процесса
LoadFromStream загружает данные из потока данных (FileStream и т.д.), стрим может быть открыт как из накопителя так и из памяти процесса
Github: _https://github.com/redheadgektor
Discord: Конь! Чаю!#9382 (сижу редко)
YouTube: _https://www.youtube.com/channel/UCPQ04Xpbbw2uGc1gsZtO3HQ
Telegram: _https://t.me/redheadgektor
Аватара пользователя
Jarico
Адепт
 
Сообщения: 1084
Зарегистрирован: 06 янв 2019, 17:37
Откуда: 0xDEAD
Skype: none
  • Сайт

Re: Работа с AssetBundle.

Сообщение Jags 25 авг 2022, 11:28

Jarico писал(а):
Jags писал(а):LoadFromStreamAsync тоже ведь память нагружает?

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


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

Если не ошибаюсь, если грузить сцены в память, то такой байды нет. Можешь их вызывать когда захочешь.
Jags
UNец
 
Сообщения: 24
Зарегистрирован: 23 июн 2022, 23:11

Re: Работа с AssetBundle.

Сообщение Jags 25 авг 2022, 11:51

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

Re: Работа с AssetBundle.

Сообщение Jarico 25 авг 2022, 15:13

Не знаю с какими ты там массивами работаешь, но я бандлы использую так:
У меня есть префаб ClientUI (меню, HUD и прочая дичь), для него отдельный бандл (чисто для префаба) и есть другие бандлы ui_materials ui_textures ui_shaders и т.д.
Чтобы ClientUI нормально загрузился (без потерь ссылок на ресурсы) нужно загрузить все бандлы (можно беспорядочно) которые имеют отношение к бандлу префаба а затем делать Instantiate, т.к. если сделать наоборот двиг при клонировании префаба на сцену не применяет ресурсы автоматически и будут потерянные ссылки
Github: _https://github.com/redheadgektor
Discord: Конь! Чаю!#9382 (сижу редко)
YouTube: _https://www.youtube.com/channel/UCPQ04Xpbbw2uGc1gsZtO3HQ
Telegram: _https://t.me/redheadgektor
Аватара пользователя
Jarico
Адепт
 
Сообщения: 1084
Зарегистрирован: 06 янв 2019, 17:37
Откуда: 0xDEAD
Skype: none
  • Сайт

Re: Работа с AssetBundle.

Сообщение Jags 26 авг 2022, 13:06

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


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

Re: Работа с AssetBundle.

Сообщение Jarico 26 авг 2022, 14:26

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


Я же писал что сцены не имеют ссылок, только инфу т.к. являются не бандлами а сценами
Даже можно проверить является ли бандл сценой, у бандлов содержащие сцену(ы) есть параметр isStreamedSceneAssetBundle
Github: _https://github.com/redheadgektor
Discord: Конь! Чаю!#9382 (сижу редко)
YouTube: _https://www.youtube.com/channel/UCPQ04Xpbbw2uGc1gsZtO3HQ
Telegram: _https://t.me/redheadgektor
Аватара пользователя
Jarico
Адепт
 
Сообщения: 1084
Зарегистрирован: 06 янв 2019, 17:37
Откуда: 0xDEAD
Skype: none
  • Сайт

Re: Работа с AssetBundle.

Сообщение Jags 20 сен 2022, 00:21

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% и всё. Можно это сделать как то плавно?
Jags
UNец
 
Сообщения: 24
Зарегистрирован: 23 июн 2022, 23:11

Re: Работа с AssetBundle.

Сообщение 1max1 20 сен 2022, 00:44

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

Видимо очень быстро загружает))
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Работа с AssetBundle.

Сообщение Jags 20 сен 2022, 11:19

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

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

Это функция разве не работает только для скачивания бандла? Не совсем понял по документации. Сам бандл нагружен, распаковывает около 15 секунд....
Jags
UNец
 
Сообщения: 24
Зарегистрирован: 23 июн 2022, 23:11

Re: Работа с AssetBundle.

Сообщение Jags 23 сен 2022, 12:31

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

Re: Работа с AssetBundle.

Сообщение Saltant 23 сен 2022, 17:35

Выводи прогресс по количеству загруженных бандлов, так оно правильней.
Типа "Загрузка текстур 1/1000" и т.д
Я на Google Play _https://play.google.com/store/apps/developer?id=Saltant
Аватара пользователя
Saltant
Адепт
 
Сообщения: 2234
Зарегистрирован: 09 окт 2018, 16:40
Откуда: Химки
  • Сайт

След.

Вернуться в Общие вопросы

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 13