Integrowanie dostawy zasobów (Unity)

Podczas integracji dostarczania zasobów gry na Unity mogą uzyskać dostęp do pakietów zasobów za pomocą elementów Addressables lub AssetBundles. Adresy URL to: nowsze i zalecane rozwiązanie do przesyłania zasobów w grach stworzonych na Unity 2019.4 lub nowszej, natomiast AssetBundles obsługuje pakiety zasobów w Unity 2017.4 i 2018.4.

Urządzenia adresowane Unity

W przypadku gier na Androida Unity 2019.4 lub nowszym należy użyć Obiekty adresowe na potrzeby przesyłania zasobów na Androida. Unity udostępnia interfejs Play Asset Delivery (PAD) API obsługi pakietów zasobów Androida za pomocą aplikacji Addressable. Informacje o korzystaniu z Adresy URL:

Używaj plików AssetBundle

Gry stworzone na Unity 2017.4 i 2018.4 mogą używać plików AssetBundle na potrzeby zasobów na urządzeniach z Androidem. Jedność AssetBundle (Pakiet zasobów) zawierają zserializowane zasoby, które mogą być ładowane przez silnik Unity, gdy jest uruchomiona aplikacja. Pliki te są powiązane z konkretną platformą (np. są tworzone Androida) i można go używać w połączeniu z pakietami zasobów. Najczęściej jeden plik AssetBundle jest spakowany w jeden pakiet zasobów, używając tej samej nazwy co plik AssetBundle. Jeśli zależy Ci na większej elastyczności w tworzeniu pakiet zasobów, skonfigurować pakiet zasobów za pomocą interfejsu API.

W czasie działania używaj usługi Play Asset Delivery dla Unity klasy, aby pobrać obiekt AssetBundle spakowany w pakiecie zasobów.

Wymagania wstępne

  1. Pobierz najnowszą wersję wtyczki Play Asset Delivery Unity z pakietów Google dla zjednoczenie.

  2. Utwórz pakiety zasobów w Unity

Konfigurowanie pakietu AssetBundles za pomocą interfejsu użytkownika

  1. Skonfiguruj każdy pakiet zasobów w pakiecie zasobów:

    1. Wybierz Google > Android App Bundle > Ustawienia dostawy zasobów.
    2. Aby wybrać foldery, które bezpośrednio zawierają pliki AssetBundle, kliknij Dodaj Folder.

  2. W przypadku każdego pakietu zmień Tryb dostarczania na Czas instalacji, Szybki Obserwuj lub Na żądanie. Napraw błędy lub zależności i zamknij okno.

  3. Wybierz Google > Utwórz pakiet Android App Bundle, aby utworzyć pakiet aplikacji.

  4. (Opcjonalnie) Skonfiguruj pakiet aplikacji, aby obsługiwał różne tekstury formatów kompresji.

Skonfiguruj pakiety zasobów za pomocą interfejsu API

Dostawa zasobów możesz skonfigurować za pomocą skryptów edytora, które można uruchamiać w ramach zautomatyzowanego systemu kompilacji.

Użyj AssetPackConfig określa też, które zasoby uwzględnić w kompilacji Android App Bundle. . Te pakiety nie muszą zawierać komponent 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);
}

Możesz też użyć statycznego parametru BuildBundle metoda w klasie Bundletool do generowania pakietu Android App Bundle z zasobem pakiety, podane BuildPlayerOptions oraz AssetPackConfig.

Aby zobaczyć samouczek, zobacz Korzystanie z Play Asset Delivery w grach z programu Unity.

Integracja z interfejsem Play Asset Delivery Unity API

Play Asset Delivery Unity API udostępnia funkcję wysyłania żądań pakietów zasobów, zarządzania pobieraniem dostęp do zasobów. Pamiętaj, aby najpierw dodać wtyczkę Unity do swojego projektu.

Funkcje, z których możesz korzystać w interfejsie API, zależą od tego, jak go utworzono z pakietów zasobów.

Jeśli utworzyłeś pakiety zasobów za pomocą interfejsu wtyczki, wybierz Pakiety zasobów skonfigurowane przez wtyczki.

Jeśli utworzyłeś pakiety zasobów za pomocą interfejsu API (lub interfejsu wtyczki), wybierz Pakiety zasobów skonfigurowane przez interfejs API.

.

Implementujesz interfejs API zgodnie z typem dostarczania z pakietu zasobów, do którego chcesz uzyskać dostęp. Czynności te są pokazane poniżej schemat blokowy.

Diagram przepływu pakietu zasobów dla wtyczki

Rysunek 1. Schemat procesu uzyskiwania dostępu do pakietów zasobów

Pobierz pakiet AssetBundles

Importuj Biblioteka Play Asset Delivery i wywołaj funkcję RetrieveAssetBundleAsync(). do pobrania obiektu 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);

Dostawa w czasie instalacji

Pakiety zasobów skonfigurowane jako install-time są od razu dostępne w aplikacji Możesz skorzystać z tych sposobów, aby wczytać scenę z pakietu 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]);

Szybkie śledzenie i dostawy na żądanie

Te sekcje dotyczą pakietów zasobów fast-follow i on-demand.

Sprawdź stan

Każdy pakiet zasobów jest przechowywany w osobnym folderze w pamięci wewnętrznej aplikacji. Użyj isDownloaded() aby określić, czy pakiet zasobów został już pobrany.

Monitorowanie pobierania

Zapytanie PlayAssetBundleRequest do monitorowania stanu żądania:

// 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;
}

Duże pliki do pobrania

Pakiety zasobów większe niż 200 MB mogą być pobierane automatycznie, ale tylko przez Wi-Fi. Jeśli użytkownik nie korzysta z Wi-Fi, stan PlayAssetBundleRequest jest ustawiony na AssetDeliveryStatus.WaitingForWifi. a pobieranie zostanie wstrzymane. W takim przypadku poczekaj, aż urządzenie się połączy. połączyć się z siecią Wi-Fi, wznowić pobieranie lub wyświetlić użytkownikowi prośbę o zgodę na pobranie przez połączenie komórkowe.

Wymagane potwierdzenie użytkownika

Jeśli pakiet ma stan AssetDeliveryStatus.RequiresUserConfirmation, parametr pobieranie nie zostanie kontynuowane, dopóki użytkownik nie zaakceptuje okna wyświetlanego z PlayAssetDelivery.ShowConfirmationDialog() Ten stan może wystąpić, jeśli aplikacja nie jest rozpoznawana przez Google Play. Pamiętaj, że funkcja W tym przypadku parametr PlayAssetDelivery.ShowConfirmationDialog() sprawia, że aplikacja być aktualizowane. Po aktualizacji ponownie poproś o komponenty.

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;
    }
}

Anulowanie prośby (tylko na żądanie)

Jeśli musisz anulować żądanie przed załadowaniem zasobów AssetBundles w Memory, wywołaj funkcję AttemptCancel() na PlayAssetBundleRequest obiekt:

// 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.
}

Asynchroniczne żądania pakietów zasobów

W większości przypadków należy użyć atrybutu Korutyny w: żądać pakietów zasobów asynchronicznie i monitorować postęp, co pokazuje :

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;

Więcej informacji o postępowaniu z błędami znajdziesz na liście AssetDeliveryErrorCodes

Inne metody interfejsu Play Core API

Poniżej znajdziesz dodatkowe metody interfejsu API, których możesz użyć w swojej aplikacji.

Sprawdzanie rozmiaru pobieranego pliku

Sprawdzanie rozmiaru obiektu AssetBundle przez asynchroniczne wywołanie Google Play i ustawić metodę wywołania zwrotnego po zakończeniu operacji:

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();
    }
}

Usuń pakiety zasobów

Możesz usunąć pakiety AssetBunds, które są szybko obserwowane i na żądanie, które nie są obecnie załadowane do pamięci. Wykonaj następujące wywołanie asynchroniczne i ustaw wywołanie zwrotne po zakończeniu:

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.
                }
            };

Dalsze kroki

Przetestuj wyświetlanie zasobów lokalnie i z: Google Play.