При интеграции доставки объектов игры Unity могут получать доступ к пакетам объектов с помощью Addressables или AssetBundles. Addressables – это более современное и рекомендуемое решение для доставки объектов в играх, созданных с помощью Unity 2019.4 или более поздней версии. AssetBundles поддерживают пакеты объектов в Unity 2017.4 и 2018.4.
Unity Addressables
В играх, созданных с помощью Unity 2019.4 или более поздней версии, для доставки контента на устройства Android следует использовать Addressables. В Unity есть API Play Asset Delivery (PAD), который позволяет работать с наборами ресурсов Android с помощью Addressables. Информацию об использовании Addressables можно найти в следующих статьях:
- Пакет Addressables для Android
- Руководство по PAD для Unity
- Справочная документация по PAD API для Unity
Как использовать файлы AssetBundle
В играх, созданных с помощью Unity 2017.4 и 2018.4, можно использовать файлы AssetBundle для доставки контента на устройства Android. Файлы AssetBundle Unity содержат сериализованные объекты, которые могут быть загружены движком Unity во время работы приложения. Эти файлы предназначены для определенных платформ (например, Android) и могут использоваться вместе с пакетами объектов. Обычно один файл AssetBundle упаковывается в один пакет объектов, название которого совпадает с названием AssetBundle. Если вам нужна большая гибкость при создании пакета объектов, настройте его с помощью API.
Во время выполнения используйте класс Play Asset Delivery for Unity, чтобы получить пакет AssetBundle, упакованный в пакет объектов.
Требования
- Настройте среду разработки:
OpenUPM-CLI
Если у вас установлен интерфейс командной строки OpenUPM, вы можете установить реестр OpenUPM с помощью следующей команды:
openupm add com.google.play.assetdeliveryOpenUPM
Откройте настройки менеджера пакетов, выбрав в меню Unity Edit > Project Settings > Package Manager (Правка > Настройки проекта > Менеджер пакетов).
Добавьте OpenUPM в качестве реестра с областью действия в окне Package Manager (Менеджер пакетов):
Name: package.openupm.com URL: https://package.openupm.com Scopes: com.google.external-dependency-manager com.google.play.common com.google.play.core com.google.play.assetdelivery com.google.android.appbundleОткройте меню менеджера пакетов, выбрав в меню Unity Window > Package Manager (Окно > Менеджер пакетов).
В раскрывающемся списке выберите Мои реестры.
Выберите пакет Плагин Google Play Integrity для Unity из списка пакетов и нажмите Установить.
Как импортировать данные из GitHub
Скачайте последнюю версию
.unitypackageс сайта GitHub.Импортируйте файл
.unitypackage, выбрав в меню Unity Assets > Import package > Custom Package и импортировав все объекты.
Как настроить AssetBundle с помощью интерфейса
Настройте каждый пакет AssetBundle в пакете объектов:
- Выберите Google > Набор Android App Bundle > Настройки Asset Delivery.
- Чтобы выбрать папки, в которых непосредственно находятся файлы AssetBundle, нажмите Добавить папку.

Для каждого пакета измените режим доставки на Во время установки, Быстрая загрузка или По запросу. Устраните все ошибки и зависимости и закройте окно.

Выберите Google > Build Android App Bundle (Google > Создать пакет приложений для Android).
Настройте набор App Bundle так, чтобы он поддерживал разные форматы сжатия текстур (необязательно).
Как настроить пакеты объектов с помощью API
Вы можете настроить доставку объектов с помощью скриптов редактора, которые можно запустить как часть автоматизированной системы сборки.
Используйте класс AssetPackConfig, чтобы указать, какие объекты нужно включить в сборку пакета приложений Android, а также режим доставки объектов. Эти пакеты объектов не обязательно должны содержать AssetBundle.
public void ConfigureAssetPacks { // Creates an AssetPackConfig with a single asset pack, named // examplePackName, containing all the files in path/to/exampleFolder. var assetPackConfig = new AssetPackConfig(); assetPackConfig.AddAssetsFolder("examplePackName", "path/to/exampleFolder", AssetPackDeliveryMode.OnDemand); // Configures the build system to use the newly created assetPackConfig when // calling Google > Build and Run or Google > Build Android App Bundle. AssetPackConfigSerializer.SaveConfig(assetPackConfig); // Alternatively, use BundleTool.BuildBundle to build an App Bundle from script. BuildBundle(new buildPlayerOptions(), assetPackConfig); }
Вы также можете использовать статический метод BuildBundle класса Bundletool, чтобы создать набор Android App Bundle с пакетами объектов, используя BuildPlayerOptions и AssetPackConfig.
Пошаговое руководство см. в практической работе по использованию Play Asset Delivery в играх Unity.
Как интегрировать Play Asset Delivery Unity API
Play Asset Delivery Unity API позволяет запрашивать пакеты ресурсов, управлять их скачиванием и получать доступ к ним. Сначала добавьте в проект плагин Unity.
Функции, которые вы используете в API, зависят от того, как вы создали пакеты ресурсов.
Если вы создали пакеты объектов с помощью интерфейса плагина, выберите Пакеты объектов, настроенные с помощью плагина.
Если вы создали наборы объектов с помощью API или интерфейса плагина, выберите Наборы объектов, настроенные через API.
Вы реализуете API в соответствии с типом доставки пакета объектов, к которому хотите получить доступ. Эти шаги показаны на следующей блок-схеме.
Рисунок 1. Блок-схема доступа к пакетам объектов
Как получить пакеты объектов
Импортируйте библиотеку Play Asset Delivery и вызовите метод RetrieveAssetBundleAsync(), чтобы получить AssetBundle.
using Google.Play.AssetDelivery; // Loads the AssetBundle from disk, downloading the asset pack containing it if necessary. PlayAssetBundleRequest bundleRequest = PlayAssetDelivery.RetrieveAssetBundleAsync(asset-bundle-name);
Доставка во время установки
Пакеты объектов, настроенные как install-time, становятся доступны сразу после запуска приложения. Чтобы загрузить сцену из AssetBundle, можно использовать следующие методы:
AssetBundle assetBundle = bundleRequest.AssetBundle; // You may choose to load scenes from the AssetBundle. For example: string[] scenePaths = assetBundle.GetAllScenePaths(); SceneManager.LoadScene(scenePaths[path-index]);
Fast-follow и доставка по запросу
Эти разделы относятся к наборам объектов fast-follow и on-demand.
Проверить статус
Каждый пакет объектов хранится в отдельной папке во внутренней памяти (устройства) приложения.
Используйте метод isDownloaded(), чтобы определить, был ли уже скачан пакет объектов.
Как отслеживать скачивание
Запросите объект PlayAssetBundleRequest, чтобы отслеживать статус запроса:
// Download progress of request, between 0.0f and 1.0f. The value will always be // 1.0 for assets delivered as install-time. // NOTE: A value of 1.0 will only signify the download is complete. It will still need to be loaded. float progress = bundleRequest.DownloadProgress; // Returns true if: // * it had either completed the download, installing, and loading of the AssetBundle, // * OR if it has encountered an error. bool done = bundleRequest.IsDone; // Returns status of retrieval request. AssetDeliveryStatus status = bundleRequest.Status; switch(status) { case AssetDeliveryStatus.Pending: // Asset pack download is pending - N/A for install-time assets. case AssetDeliveryStatus.Retrieving: // Asset pack is being downloaded and transferred to app storage. // N/A for install-time assets. case AssetDeliveryStatus.Available: // Asset pack is downloaded on disk but NOT loaded into memory. // For PlayAssetPackRequest(), this indicates that the request is complete. case AssetDeliveryStatus.Loading: // Asset pack is being loaded. case AssetDeliveryStatus.Loaded: // Asset pack has finished loading, assets can now be loaded. // For PlayAssetBundleRequest(), this indicates that the request is complete. case AssetDeliveryStatus.Failed: // Asset pack retrieval has failed. case AssetDeliveryStatus.WaitingForWifi: // Asset pack retrieval paused until either the device connects via Wi-Fi, // or the user accepts the PlayAssetDelivery.ShowConfirmationDialog dialog. case AssetDeliveryStatus.RequiresUserConfirmation: // Asset pack retrieval paused until the user accepts the // PlayAssetDelivery.ShowConfirmationDialog dialog. default: break; }
Большие файлы
Пакеты ресурсов размером более 200 МБ могут скачиваться автоматически, но только по Wi-Fi. Если пользователь не подключен к Wi-Fi, статус PlayAssetBundleRequest будет AssetDeliveryStatus.WaitingForWifi, а скачивание приостановится. В этом случае подождите, пока устройство подключится к сети Wi-Fi и скачивание возобновится, или запросите у пользователя разрешение на скачивание пакета по мобильной сети.
Требуется подтверждение пользователя
Если у пакета статус AssetDeliveryStatus.RequiresUserConfirmation, скачивание не начнется, пока пользователь не примет условия в диалоговом окне, которое показывается вместе с PlayAssetDelivery.ShowConfirmationDialog(). Этот статус может появиться, если приложение не распознается Google Play. Обратите внимание, что вызов функции
PlayAssetDelivery.ShowConfirmationDialog() в этом случае приводит к обновлению приложения. После обновления запросите объекты ещё раз.
if(request.Status == AssetDeliveryStatus.RequiresUserConfirmation || request.Status == AssetDeliveryStatus.WaitingForWifi) { var userConfirmationOperation = PlayAssetDelivery.ShowConfirmationDialog(); yield return userConfirmationOperation; switch(userConfirmationOperation.GetResult()) { case ConfirmationDialogResult.Unknown: // userConfirmationOperation finished with an error. Something went // wrong when displaying the prompt to the user, and they weren't // able to interact with the dialog. case ConfirmationDialogResult.Accepted: // User accepted the confirmation dialog--an update will start. case ConfirmationDialogResult.Declined: // User canceled or declined the dialog. It can be shown again. default: break; } }
Как отменить запрос (только для запросов по требованию)
Если вам нужно отменить запрос до того, как AssetBundles будут загружены в память, вызовите метод AttemptCancel() для объекта PlayAssetBundleRequest:
// Will only attempt if the status is Pending, Retrieving, or Available - otherwise // it will be a no-op. bundleRequest.AttemptCancel(); // Check to see if the request was successful by checking if the error code is Canceled. if(bundleRequest.Error == AssetDeliveryErrorCode.Canceled) { // Request was successfully canceled. }
Как запрашивать пакеты объектов асинхронно
В большинстве случаев для асинхронного запроса пакетов объектов и отслеживания прогресса следует использовать сопрограммы, как показано ниже.
private IEnumerator LoadAssetBundleCoroutine(string assetBundleName) { PlayAssetBundleRequest bundleRequest = PlayAssetDelivery.RetrieveAssetBundleAsync(assetBundleName); while (!bundleRequest.IsDone) { if(bundleRequest.Status == AssetDeliveryStatus.WaitingForWifi) { var userConfirmationOperation = PlayAssetDelivery.ShowCellularDataConfirmation(); // Wait for confirmation dialog action. yield return userConfirmationOperation; if((userConfirmationOperation.Error != AssetDeliveryErrorCode.NoError) || (userConfirmationOperation.GetResult() != ConfirmationDialogResult.Accepted)) { // The user did not accept the confirmation. Handle as needed. } // Wait for Wi-Fi connection OR confirmation dialog acceptance before moving on. yield return new WaitUntil(() => bundleRequest.Status != AssetDeliveryStatus.WaitingForWifi); } // Use bundleRequest.DownloadProgress to track download progress. // Use bundleRequest.Status to track the status of request. yield return null; } if (bundleRequest.Error != AssetDeliveryErrorCode.NoError) { // There was an error retrieving the bundle. For error codes NetworkError // and InsufficientStorage, you may prompt the user to check their // connection settings or check their storage space, respectively, then // try again. yield return null; } // Request was successful. Retrieve AssetBundle from request.AssetBundle. AssetBundle assetBundle = bundleRequest.AssetBundle;
Подробнее о том, как устранять ошибкиAssetDeliveryErrorCodes…
Другие методы Play Core API
Ниже перечислены дополнительные методы API, которые могут быть полезны в вашем приложении.
Как проверить размер скачиваемого файла
Чтобы проверить размер AssetBundle, сделайте асинхронный вызов в Google Play и задайте метод обратного вызова, который будет выполнен после завершения операции:
public IEnumerator GetDownloadSize() { PlayAsyncOperation<long> getSizeOperation = PlayAssetDelivery.GetDownloadSize(assetPackName); yield return getSizeOperation; if(operation.Error != AssetDeliveryErrorCode.NoError) { // Error while retrieving download size. } else { // Download size is given in bytes. long downloadSize = operation.GetResult(); } }
Как удалить пакеты объектов
Вы можете удалить пакеты AssetBundle, которые не загружены в память, но используются для fast-follow и по запросу. Выполните следующий асинхронный вызов и задайте метод обратного вызова, который будет выполнен после завершения вызова:
PlayAsyncOperation<string> removeOperation = PlayAssetDelivery.RemoveAssetPack(assetBundleName); removeOperation.Completed += (operation) => { if(operation.Error != AssetDeliveryErrorCode.NoError) { // Error while attempting to remove AssetBundles. } else { // Files were deleted OR files did not exist to begin with. } };
Дальнейшие действия
Проверьте доставку контента локально и из Google Play.