Asset Delivery integrieren (Unity)

Bei der Einbindung von Asset Delivery können über Addressables oder AssetBundles auf Asset-Packs zugreifen. Adressierbaren sind die neuere und empfohlene Asset Delivery-Lösung für Spiele, die mit Unity entwickelt wurden Version 2019.4 oder höher, während AssetBundles Asset-Packs in Unity unterstützen 2017.4 und 2018.4.

Unity-Adressen

Bei Spielen, die mit Unity 2019.4 oder höher entwickelt wurden, sollte Adressables für die Asset-Lieferung unter Android. Unity bietet eine Play Asset Delivery (PAD) API zur Handhabung von Android-Asset-Packs mit Addressables. Informationen zur Verwendung Adressables finden Sie hier:

AssetBundle-Dateien verwenden

Bei Spielen, die mit Unity 2017.4 und 2018.4 erstellt wurden, können AssetBundle-Dateien als Asset verwendet werden Auslieferung auf Android-Geräten. Einheit Asset-Bundle Dateien serialisierte Assets enthalten, die von der Unity-Engine geladen werden können, App ausgeführt wird. Diese Dateien sind plattformspezifisch (z. B. für Android) und können in Kombination mit Asset-Packs verwendet werden. Am häufigsten werden eine AssetBundle-Datei ist in einem einzelnen Asset-Pack gepackt, mit demselben Namen wie das AssetBundle. Wenn Sie beim Erstellen eines Asset-Packs, Konfigurieren Sie das Asset-Pack mithilfe der API.

Verwende zur Laufzeit Play Asset Delivery für Unity , um ein in einem Asset-Pack verpacktes AssetBundle abzurufen.

Voraussetzungen

  1. Laden Sie die neueste Version des Play Asset Delivery Unity-Plug-ins aus Google-Pakete für Unity:

  2. Asset-Bundles in Unity erstellen

AssetBundles über die Benutzeroberfläche konfigurieren

  1. Konfiguriere jedes AssetBundle in einem Asset-Pack:

    1. Wählen Sie Google > Android App Bundle > Einstellungen für die Asset Delivery
    2. Um Ordner auszuwählen, die direkt AssetBundle-Dateien enthalten, klicken Sie auf Hinzufügen Ordner:

  2. Ändere für jedes Bundle den Delivery Mode (Übermittlungsmodus) auf Install Time (Installationszeit), Fast (Schnell) Folgen oder Aufgezeichnete Inhalte Beheben Sie alle Fehler oder Abhängigkeiten und schließen Sie den .

  3. Wählen Sie Google > Erstellen Sie ein Android App Bundle, um das App Bundle zu erstellen.

  4. Optional: Konfigurieren Sie Ihr App Bundle so, dass es unterschiedliche Texturen unterstützt. Komprimierungsformaten.

Asset-Packs mit der API konfigurieren

Sie können die Asset-Bereitstellung über Editor-Skripts konfigurieren, die im Rahmen eines automatisierten Build-Systems.

Verwenden Sie die Methode AssetPackConfig , um zu definieren, welche Assets in einem Android App Bundle-Build enthalten sein sollen, als Übermittlungsmodus der Assets. Diese Asset-Packs müssen keine ein Asset-Bundle.

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 Klasse Bundletool, um ein Android App Bundle mit Asset zu generieren Pakete, gegeben BuildPlayerOptions und AssetPackConfig

Eine interaktive Anleitung finden Sie in der Play Asset Delivery im Codelab für Unity-Spiele verwenden

In die Play Asset Delivery Unity API einbinden

Die Play Asset Delivery Unity API Funktionen zum Anfordern von Asset-Packs, Verwalten von Downloads und beim Zugriff auf die Assets. Fügen Sie Ihrem Projekt zuerst das Unity-Plug-in hinzu.

Welche Funktionen Sie in der API verwenden, hängt davon ab, wie Sie der Asset-Packs.

Wenn Sie über die Plug-in-Benutzeroberfläche Asset-Packs erstellt haben, wählen Sie Über Plug-in konfigurierte Asset-Packs aus.

Wenn Sie mit der API (oder Plug-in-UI) erstellte Asset-Packs, wählen Sie API-konfigurierte Asset-Packs aus.

<ph type="x-smartling-placeholder"></ph>

Sie implementieren die API entsprechend dem Übermittlungstyp von das Asset-Pack, auf das Sie zugreifen möchten. Diese Schritte werden im Folgenden beschrieben: Flussdiagramm.

Asset-Pack-Flussdiagramm für das Plug-in

Abbildung 1: Flussdiagramm für den Zugriff auf Asset-Packs

Asset-Bundles abrufen

Importieren Sie die Asset Delivery-Bibliothek von Google Play und rufen Sie die Methode RetrieveAssetBundleAsync() um ein AssetBundle abzurufen.

using Google.Play.AssetDelivery;

// Loads the AssetBundle from disk, downloading the asset pack containing it if necessary.
PlayAssetBundleRequest bundleRequest = PlayAssetDelivery.RetrieveAssetBundleAsync(asset-bundle-name);

Lieferung nach Installation

Als install-time konfigurierte Asset-Packs sind sofort in der App verfügbar Markteinführung. So laden Sie eine Szene aus dem 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]);

Schnelle Folgen- und On-Demand-Bereitstellung

Diese Abschnitte gelten für Asset-Packs fast-follow und on-demand.

Status prüfen

Jedes Asset-Pack wird in einem separaten Ordner im internen Speicher der App gespeichert. Verwenden Sie die Methode isDownloaded() um festzustellen, ob bereits ein Asset-Pack heruntergeladen wurde.

Download überwachen

Fragen Sie die PlayAssetBundleRequest , um den Status der Anfrage zu überwachen:

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

Große Downloads

Asset-Packs, die größer als 200 MB sind, können automatisch heruntergeladen werden, allerdings nur bei WLAN. Wenn der Nutzer nicht mit einem WLAN verbunden ist, ist der Status von PlayAssetBundleRequest auf AssetDeliveryStatus.WaitingForWifi und der Download wird angehalten. Warten Sie in diesem Fall, bis das Gerät verbunden ist. eine WLAN-Verbindung herstellen, den Download fortsetzen oder den Nutzer um Zustimmung zum Herunterladen des über eine Mobilfunkverbindung aus.

Erforderliche Nutzerbestätigung

Hat ein Paket den Status AssetDeliveryStatus.RequiresUserConfirmation, Der Download wird erst fortgesetzt, wenn der Nutzer das Dialogfeld mit PlayAssetDelivery.ShowConfirmationDialog(). Dieser Status kann auftreten, wenn die App wird von Google Play nicht erkannt. Beachten Sie, dass das Aufrufen PlayAssetDelivery.ShowConfirmationDialog() führt in diesem Fall dazu, dass die App aktualisiert werden. 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 stornieren (nur bei Bedarf)

Wenn Sie die Anfrage abbrechen müssen, bevor die AssetBundles erinnern, rufen Sie die AttemptCancel() auf der PlayAssetBundleRequest -Objekt enthält:

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

Asset-Packs asynchron anfordern

In den meisten Fällen sollten Sie Coroutinen zu fordern Sie Asset-Packs asynchron an und überwachen Sie den Fortschritt, wie im Folgendes:

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;

Weitere Informationen zur Fehlerbehandlung finden Sie in der Liste der AssetDeliveryErrorCodes

Andere Play Core API-Methoden

Im Folgenden finden Sie einige zusätzliche API-Methoden, die Sie in Ihrer App verwenden können.

Downloadgröße prüfen

Größe eines Asset-Bundles durch einen asynchronen Aufruf an Google Play prüfen und legen Sie eine Callback-Methode für den Abschluss des Vorgangs fest:

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

Asset-Bundles entfernen

Du kannst AssetBundles für schnelles Folgen und On-Demand entfernen, die derzeit nicht in den Arbeitsspeicher geladen. Führen Sie den folgenden asynchronen Aufruf aus und legen Sie einen Callback fest -Methode für den Abschluss des Vorgangs:

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-Lieferung lokal und von Google Play