Скачивание AssetBundle более одного раза не удается

Я разрабатываю приложение в Unity 2017.1.0f3 (для HoloLens, если это имеет значение). Это приложение имеет 3 сцены

  • Сцена 1. Пользователь предоставляет учетные данные и аутентифицируется в службе.
  • Сцена 2. Сервис предоставляет, и приложение отображает список ресурсов, из которых пользователь может выбирать.
  • Сцена 3. После выбора ресурса AssetBundle загружается и отображается пользователю.

Это сопрограмма, которая загружает AssetBundle

IEnumerator GetAssetBundle(string assetUrl, Action<AssetBundle> successCallback, Action<string> errorCallback )
    {
        UnityWebRequest request = UnityWebRequest.GetAssetBundle(assetUrl);

        yield return request.Send();

        if (request.isHttpError || request.isNetworkError)
        {
            errorCallback(request.error);
        }
        else
        {
            AssetBundle bundle = ((DownloadHandlerAssetBundle)request.downloadHandler).assetBundle;

            successCallback(bundle);
        }
    }

Пользователь имеет возможность переключаться между сценами и, возможно, дважды выбирать один и тот же ресурс. Это когда проблема возникает.

В первый раз, когда пользователь пытается загрузить AssetBundle, все работает нормально. Второй (и все последующие) раз загрузка не удалась. Ошибка связана не с ошибкой процесса загрузки, а с тем, что этот
((DownloadHandlerAssetBundle)request.downloadHandler).assetBundle; всегда равен нулю.

Я думаю, что Unity не позволит вам загружать одно и то же AssetBundle больше одного раза, и что вам придется кэшировать его после загрузки. Так ли это? Я хотел бы избежать этого, поскольку приложение может в конечном итоге иметь большое количество AssetBundle, доступных для загрузки, и кэширование их всех после их загрузки - плохой вариант.

Знаете ли вы способ загрузить один и тот же AssetBundle несколько раз, если это необходимо?


person Corcus    schedule 12.09.2017    source источник
comment
попробуйте выгрузить пакет, когда закончите: bundle.Unload()   -  person joreldraw    schedule 12.09.2017
comment
@joreldraw Это сработало. Знаете ли вы, должен ли я также сделать что-то вроде Caching.CleanCache. Также, если вы хотите превратить свой комментарий в ответ, чтобы я мог его принять   -  person Corcus    schedule 12.09.2017
comment
Будьте осторожны с использованием AssetBundle.Unload() Если в вашей сцене есть игровые объекты, ссылающиеся на эти активы, ссылки на них пропадут Если вас это не волнует, используйте его. Правильное решение — вручную загрузить ресурс, как обычный файл, и сохранить его вручную. Не используйте GetAssetBundle или DownloadHandlerAssetBundle, если вы хотите сделать это таким образом.   -  person Programmer    schedule 12.09.2017
comment
единственный вариант очистить все это unloadallassetbundles   -  person joreldraw    schedule 12.09.2017
comment
@Programmer Мне нужно было bundle.Unload(false); Это не уничтожает уже созданные объекты.   -  person Corcus    schedule 12.09.2017
comment
Это тоже должно работать. Проголосовал за ответ, так как это действительно полезно.   -  person Programmer    schedule 12.09.2017


Ответы (1)


Вы можете выгрузить свой пакет по отдельности:

bundle.Unload(bool unloadAllLoadedObjects);

или может выгрузить весь загруженный массив пакетов:

UnloadAllAssetBundles(bool unloadAllObjects);

Будьте осторожны с опцией bool unloadAllObjects, по умолчанию она равна false. Если вы установите значение true, все ваши экземпляры ресурсов будут уничтожены, получив отсутствующие ссылки.

*Если вы не знаете все свои загруженные пакеты, вы можете получить бесчисленный список всех загруженных пакетов: AssetBundle.GetAllLoadedAssetBundles

person joreldraw    schedule 12.09.2017