Bei der Einbindung der Asset-Bereitstellung können Unity-Spiele mit Addressables oder AssetBundles auf Asset-Packs zugreifen. Addressables sind die neuere und empfohlene Lösung für die Asset-Bereitstellung für Spiele, die mit Unity 2019.4 oder höher erstellt wurden. AssetBundles unterstützen Asset-Packs in Unity 2017.4 und 2018.4.
Unity Addressables
Spiele, die mit Unity 2019.4 oder höher erstellt wurden, sollten Addressables für die Asset-Bereitstellung auf Android verwenden. Unity bietet eine Play Asset Delivery (PAD) API für die Verarbeitung von Android-Asset-Packs mit Addressables. Informationen zur Verwendung von Addressables finden Sie hier:
- Addressables for Android-Paket
- PAD-Leitfaden für Unity
- PAD API for Unity Referenzdokumentation
AssetBundle-Dateien verwenden
Spiele, die mit Unity 2017.4 und 2018.4 erstellt wurden, können AssetBundle-Dateien für die Asset-Bereitstellung auf Android verwenden. Unity AssetBundle Dateien enthalten serialisierte Assets, die von der Unity-Engine geladen werden können, während die App ausgeführt wird. Diese Dateien sind plattformspezifisch (z. B. für Android erstellt) und können in Kombination mit Asset-Packs verwendet werden. In den meisten Fällen wird eine AssetBundle-Datei in ein einzelnes Asset-Pack verpackt, wobei das Pack denselben Namen wie das AssetBundle verwendet. Wenn Sie mehr Flexibilität beim Erstellen eines Asset-Packs wünschen, konfigurieren Sie es mit der API.
Verwenden Sie zur Laufzeit die Play Asset Delivery for Unity Klasse, um ein in einem Asset-Pack verpacktes AssetBundle abzurufen.
Vorbereitung
- Entwicklungsumgebung einrichten
OpenUPM-CLI
Wenn Sie die OpenUPM-CLI installiert haben, können Sie die OpenUPM-Registrierung mit dem folgenden Befehl installieren:
openupm add com.google.play.assetdeliveryOpenUPM
Öffnen Sie die Einstellungen des Paketmanagers indem Sie im Unity-Menü die Option Edit > Project Settings > Package Manager auswählen.
Fügen Sie OpenUPM als registrierte Registrierung zum Fenster des Paketmanagers hinzu:
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Öffnen Sie das Menü des Paketmanagers, indem Sie im Unity Menü die Option Window > Package Manager auswählen.
Wählen Sie im Drop-down-Menü für den Managerbereich My Registries aus.
Wählen Sie in der Paketliste das Paket Google Play Integrity plugin for Unity aus und klicken Sie auf Install.
Aus GitHub importieren
Laden Sie die neueste
.unitypackageVersion von GitHub herunter.Importieren Sie die
.unitypackage-Datei, indem Sie im Unity-Menü Assets > Import package > Custom Package auswählen und alle Elemente importieren.
AssetBundles über die Benutzeroberfläche konfigurieren
Konfigurieren Sie jedes AssetBundle in einem Asset-Pack:
- Wählen Sie Google > Android App Bundle > Asset Delivery Settings aus.
- Klicken Sie auf Add Folder , um Ordner auszuwählen, die direkt AssetBundle-Dateien enthalten.

Ändern Sie für jedes Bundle den Delivery Mode in Install Time, Fast Follow oder On Demand. Beheben Sie alle Fehler oder Abhängigkeiten und schließen Sie das Fenster.

Wählen Sie Google > Build Android App Bundle aus, um das App Bundle zu erstellen.
(Optional) Konfigurieren Sie Ihr App Bundle so, dass verschiedene Textur komprimierungsformate unterstützt werden.
Asset-Packs mit der API konfigurieren
Sie können die Asset-Bereitstellung über Editorskripts konfigurieren, die als Teil eines automatisierten Build-Systems ausgeführt werden können.
Verwenden Sie die
AssetPackConfig
Klasse, um festzulegen, welche Assets in einen Android App Bundle-Build aufgenommen werden sollen, sowie den Bereitstellungsmodus der Assets. Diese Asset-Packs müssen kein AssetBundle enthalten.
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); }
Sie können auch die statische
BuildBundle
Methode in der Bundletool Klasse verwenden, um ein Android App Bundle mit Asset
Packs zu generieren, wenn Sie
BuildPlayerOptions
und
AssetPackConfig angeben.
Eine geführte Anleitung finden Sie im Codelab Play Asset Delivery in Unity-Spielen verwenden.
In die Play Asset Delivery Unity API einbinden
Die Play Asset Delivery Unity API bietet die Funktionen zum Anfordern von Asset-Packs, zum Verwalten von Downloads und zum Zugriff auf die Assets. Stellen Sie sicher, dass Sie zuerst das Unity-Plug-in in Ihr Projekt einfügen.
Die Funktionen, die Sie in der API verwenden, hängen davon ab, wie Sie die Asset-Packs erstellt haben.
Wenn Sie Asset-Packs über die Plug-in-Benutzeroberfläche erstellt haben, wählen Sie Plugin-configured asset packs aus.
Wenn Sie Asset-Packs mit der API (oder der Plug-in-Benutzeroberfläche) erstellt haben, wählen Sie API-configured asset packs aus.
Die API ist unabhängig vom Bereitstellungstyp des Asset-Packs, auf das Sie zugreifen möchten, ähnlich. Diese Schritte sind im folgenden Flussdiagramm dargestellt.
Abbildung 1 : Flussdiagramm für den Zugriff auf Asset-Packs
Asset-Pack abrufen
Importieren Sie die
Play Asset Delivery-Bibliothek
und rufen Sie die
RetrieveAssetPackAsync()
Methode auf, um ein Asset-Pack herunterzuladen, wenn die aktuelle Version des Packs noch nicht
auf der Festplatte verfügbar ist.
using Google.Play.AssetDelivery; // After download, the assets and/or AssetBundles contained in the asset pack // are not loaded into memory. PlayAssetPackRequest request = PlayAssetDelivery.RetrieveAssetPackAsync(assetPackName);
Bereitstellung zur Installationszeit
Ein als install-time konfiguriertes Asset-Pack ist sofort beim Start der App verfügbar, aber Sie müssen die Assets in den Arbeitsspeicher laden. Weitere Informationen finden Sie unter
Assets in den Arbeitsspeicher laden.
Fast-Follow und On-Demand-Bereitstellung
Diese Abschnitte gelten für fast-follow- und on-demand-Asset-Packs.
Status prüfen
Jedes Asset-Pack wird in einem separaten Ordner im internen Speicher der App gespeichert.
Verwenden Sie die
isDone()
Methode, um festzustellen, ob ein Asset-Pack bereits heruntergeladen wurde und
verfügbar ist oder ob ein Fehler aufgetreten ist.
Download beobachten
Fragen Sie das
PlayAssetPackRequest
Objekt ab, um den
Status
der Anfrage zu beobachten:
// 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 does not mean that the request has completed, only that // the DOWNLOADING stage is finished. float progress = request.DownloadProgress; // Returns the status of the retrieval request. // If the request completed successfully, this value should be AssetDeliveryStatus.Available. // If an error occurred, this value should be AssetDeliveryStatus.Failed. AssetDelivery status = request.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.Failed: // Asset pack retrieval 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; } // Returns true if status is AssetDeliveryStatus.Available or AssetDeliveryStatus.Failed. bool done = request.IsDone; // If AssetDeliveryStatus.Failed, find more info about the error. AssetDeliveryErrorCode error = request.Error;
Größere Downloads
Asset-Packs mit mehr als 200 MB können automatisch heruntergeladen werden, aber nur, wenn das Gerät mit einem WLAN verbunden ist. Wenn der Nutzer kein WLAN verwendet, wird der PlayAssetPackRequest
Status auf
AssetDeliveryStatus.WaitingForWifi
gesetzt und der Download wird pausiert. In diesem Fall warten Sie entweder, bis das Gerät eine WLAN-Verbindung herstellt und der Download fortgesetzt wird, oder fordern Sie den Nutzer auf, den Download des Packs über eine Mobilfunkverbindung zu genehmigen.
Nutzerbestätigung erforderlich
Wenn ein Pack den Status AssetDeliveryStatus.RequiresUserConfirmation hat, wird der Download erst fortgesetzt, wenn der Nutzer das Dialogfeld akzeptiert, das mit PlayAssetDelivery.ShowConfirmationDialog() angezeigt wird. Dieser Status kann auftreten, wenn die App nicht von Play erkannt wird. Wenn Sie in diesem Fall PlayAssetDelivery.ShowConfirmationDialog() aufrufen, wird die App aktualisiert. Fordern Sie die Assets nach der Aktualisierung noch einmal an.
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; } }
Anfrage abbrechen (nur On-Demand)
Wenn Sie die Anfrage abbrechen müssen, bevor die Asset-Packs heruntergeladen werden, rufen Sie
die
AttemptCancel()
Methode für das PlayAssetPackRequest Objekt auf:
// Will only attempt if the status is Pending, Retrieving, or Available; otherwise // it will be a no-op. request.AttemptCancel(); // Check to see if the request was successful by checking if the error code is Canceled. if(request.Error == AssetDeliveryErrorCode.Canceled) { // Request was successfully canceled. }
Assets in den Arbeitsspeicher laden
Sobald die Anfrage abgeschlossen ist, verwenden Sie eine der folgenden Funktionen, um Assets in den Arbeitsspeicher zu laden:
- Verwenden Sie
PlayAssetPackRequest.GetAssetLocation(), um einAssetLocation-Objekt abzurufen. Dieses Objekt enthält den Pfad, den Offset und die Größe des Assets, sodass es von der Festplatte geladen werden kann. - Wenn das Asset ein AssetBundle ist, können Sie die Hilfsmethode
PlayAssetPackRequest.LoadAssetBundleAsync(assetPath)verwenden. Der übergebene Asset-Pfad sollte dem Pfad zum AssetBundle innerhalb des Asset-Packs entsprechen. Dadurch wird eine AssetBundleCreateRequest zurückgegeben.
Asset-Packs asynchron anfordern
In den meisten Fällen sollten Sie Coroutinen verwenden, um Asset-Packs asynchron anzufordern und den Fortschritt zu beobachten, wie hier gezeigt:
private IEnumerator LoadAssetPackCoroutine(string assetPackName) { PlayAssetPackRequest request = PlayAssetDelivery.RetrieveAssetPackAsync(assetPackName); while (!request.IsDone) { if(request.Status == AssetDeliveryStatus.WaitingForWifi) { var userConfirmationOperation = PlayAssetDelivery.ShowConfirmationDialog(); // 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(() => request.Status != AssetDeliveryStatus.WaitingForWifi); } // Use request.DownloadProgress to track download progress. // Use request.Status to track the status of request. yield return null; } if (request.Error != AssetDeliveryErrorCode.NoError) { // There was an error retrieving the pack. 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. Load the asset pack into memory. AssetBundleCreateRequest assetBundleCreateRequest = request.LoadAssetBundleAsync(path/to/exampleBundle); yield return assetBundleCreateRequest; AssetBundle assetBundle = assetBundleCreateRequest.assetBundle;
Weitere Informationen zur Fehlerbehandlung finden Sie in der Liste der Fehlercodes.
Weitere Play Core API-Methoden
Im Folgenden finden Sie einige zusätzliche API-Methoden, die Sie in Ihrer App verwenden können.
Mehrere Asset-Packs abrufen
Verwenden Sie die folgende Funktion, um mehrere Asset-Packs gleichzeitig abzurufen:
// assetPackNames is an array of strings corresponding to asset packs. PlayAssetPackBatchRequest batchRequest = PlayAssetDelivery.RetrieveAssetPackBatchAsync(<IListstring> assetPackNames);
Beobachten Sie die Status der einzelnen Anfragen, indem Sie das Dictionary der Status prüfen:
// Dictionary of AssetPackStates, with the asset pack name as the key. Dictionary<string, PlayAssetPackRequest> requests = batchRequest.Requests; // Returns true if all requests are complete. bool requestComplete = batchRequest.IsDone;
Downloadgröße prüfen
Prüfen Sie die Größe eines Asset-Packs, indem Sie einen asynchronen Aufruf an Google Play senden und eine Callback-Methode für den Abschluss des Vorgangs festlegen:
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(); } }
AssetBundles entfernen
Sie können Fast-Follow- und On-Demand-Asset-Packs entfernen, die derzeit nicht in den Arbeitsspeicher geladen sind. Führen Sie den folgenden asynchronen Aufruf aus und legen Sie eine Callback-Methode für den Abschluss fest:
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. } };
Nächste Schritte
Testen Sie die Asset-Bereitstellung lokal und über Google Play.