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:
- Pakiet „Addressables na Androida”
- Przewodnik po Unity
- Dokumentacja PAD API dla Unity
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
Pobierz najnowszą wersję wtyczki Play Asset Delivery Unity z pakietów Google dla zjednoczenie.
Konfigurowanie pakietu AssetBundles za pomocą interfejsu użytkownika
Skonfiguruj każdy pakiet zasobów w pakiecie zasobów:
- Wybierz Google > Android App Bundle > Ustawienia dostawy zasobów.
- Aby wybrać foldery, które bezpośrednio zawierają pliki AssetBundle, kliknij Dodaj Folder.
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.
Wybierz Google > Utwórz pakiet Android App Bundle, aby utworzyć pakiet aplikacji.
(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.
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.