Integrare la pubblicazione degli asset (Unity)

Durante l'integrazione della pubblicazione delle risorse, i giochi Unity possono accedere ai pacchetti di asset utilizzando Indirizzi o AssetBundle. Gli indirizzi IP sono soluzione di pubblicazione degli asset consigliata e più recente per i giochi creati con Unity 2019.4 o versioni successive, mentre gli AssetBundle forniscono supporto per pacchetti di asset in Unity 2017.4 e 2018.4.

Indirizzi Unity

Per i giochi creati con Unity 2019.4 o versioni successive è consigliabile utilizzare Indirizzi indirizzi per l'invio di asset su Android. Unity fornisce un'API Play Asset Delivery (PAD) per la gestione dei pacchetti di asset Android tramite gli indirizzi. Per informazioni sull'utilizzo Indirizzabili:

Utilizzare i file AssetBundle

I giochi creati con Unity 2017.4 e 2018.4 possono utilizzare i file AssetBundle per gli asset su Android. Unità AssetBundle contengono asset serializzati che possono essere caricati dal motore Unity, mentre sia in esecuzione. Questi file sono specifici della piattaforma (ad esempio, creati per Android) e possono essere utilizzati in combinazione con i pacchetti di asset. Più comunemente, un file AssetBundle è pacchettizzato in un unico pacchetto di asset, con il set utilizzando lo stesso nome di AssetBundle. Se desideri maggiore flessibilità nella creazione di pacchetto di asset, configurare il pacchetto di asset utilizzando l'API.

In fase di runtime, utilizza Play Asset Delivery per Unity per recuperare un AssetBundle pacchettizzato in un pacchetto di asset.

Prerequisiti

  1. Scarica l'ultima versione del plug-in Unity di Play Asset Delivery dai pacchetti Google per Unity.

  2. Crea assetBundle in Unity.

Configurare AssetBundles utilizzando l'interfaccia utente

  1. Configura ciascun AssetBundle in un pacchetto di asset:

    1. Seleziona Google > Android App Bundle > Impostazioni di pubblicazione degli asset.
    2. Per selezionare cartelle che contengono direttamente i file AssetBundle, fai clic su Aggiungi Cartella.

  2. Per ogni pacchetto, imposta la Modalità di invio su Ora di installazione, Rapida. Segui oppure On demand. Risolvi eventuali errori o dipendenze e chiudi il finestra.

  3. Seleziona Google > Crea Android App Bundle per creare l'app bundle.

  4. (Facoltativo) Configura l'app bundle in modo che supporti una texture diversa formati di compressione.

Configurare i pacchetti di asset utilizzando l'API

Puoi configurare la pubblicazione degli asset tramite script dell'editor, che possono essere eseguiti come parte di un sistema di compilazione automatizzato.

Utilizza la AssetPackConfig per definire quali asset includere in una build Android App Bundle, nonché come modalità di invio degli asset. Questi pacchetti di asset non devono contenere un 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);
}

Puoi anche usare il formato BuildBundle nella classe Bundletool per generare un Android App Bundle con asset pacchetti, considerati BuildPlayerOptions e AssetPackConfig

Per un tutorial guidato, vedi Utilizzare il codelab Play Asset Delivery nei giochi Unity.

Eseguire l'integrazione con l'API Play Asset Delivery Unity

La API Play Asset Delivery Unity offre la funzionalità per richiedere pacchetti di asset, gestire i download e che accedono agli asset. Assicurati prima di aggiungere il plug-in Unity al tuo progetto.

Le funzioni che utilizzi nell'API dipendono da come hai creato i pacchetti di asset.

Se creato pacchetti di asset utilizzando l'interfaccia utente del plug-in Seleziona Pacchetti di asset configurati dal plug-in.

Se creato pacchetti di asset utilizzando l'API (o l'interfaccia utente del plug-in) seleziona pacchetti di asset configurati tramite API.

L'API viene implementata in base al tipo di pubblicazione il pacchetto di asset a cui vuoi accedere. Questi passaggi sono mostrati di seguito un diagramma di flusso.

Diagramma di flusso del pacchetto di asset per il plug-in

Figura 1. Diagramma di flusso per l'accesso ai pacchetti di asset

Recuperare gli AssetBundle

Importa il Raccolta di Play Asset Delivery e richiamare il RetrieveAssetBundleAsync(): per recuperare un 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);

Consegna al momento dell'installazione

I pacchetti di asset configurati come install-time sono immediatamente disponibili nell'app avviare l'applicazione. Puoi utilizzare quanto segue per caricare una scena da 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]);

Consegna rapida successiva e on demand

Queste sezioni si applicano ai pacchetti di asset fast-follow e on-demand.

Verifica lo stato

Ogni pacchetto di asset viene archiviato in una cartella separata nella memoria interna dell'app. Utilizza la isDownloaded() per determinare se un pacchetto di asset è già stato scaricato.

Monitora il download

Esegui una query sul PlayAssetBundleRequest per monitorare lo stato della richiesta:

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

Download di grandi dimensioni

I pacchetti di asset più grandi di 200 MB possono essere scaricati automaticamente, ma solo tramite Wi-Fi. Se l'utente non è connesso alla rete Wi-Fi, lo stato PlayAssetBundleRequest è impostato su AssetDeliveryStatus.WaitingForWifi e il download viene sospeso. In questo caso, attendi che il dispositivo si connetta alla rete Wi-Fi, riprendere il download o chiedere all'utente l'approvazione per scaricare l'app pacchettizzati tramite una rete cellulare.

Conferma utente richiesta

Se lo stato di un pacchetto è AssetDeliveryStatus.RequiresUserConfirmation, il valore il download non continuerà finché l'utente non accetta la finestra di dialogo mostrata con PlayAssetDelivery.ShowConfirmationDialog(). Questo stato può apparire se l'app non viene riconosciuto da Google Play. Tieni presente che le chiamate PlayAssetDelivery.ShowConfirmationDialog() in questo caso fa sì che l'app essere aggiornate. Dopo l'aggiornamento, richiedi nuovamente gli asset.

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

Annullare una richiesta (solo on demand)

Se devi annullare la richiesta prima del caricamento degli AssetBundle , richiama il AttemptCancel() nella 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.
}

Richiedi pacchetti di asset in modo asincrono

Nella maggior parte dei casi, dovresti usare Coroutine per di richiedere i pacchetti di asset in modo asincrono e di monitorare l'avanzamento, come mostrato seguenti:

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;

Per ulteriori informazioni sulla gestione degli errori, consulta l'elenco delle AssetDeliveryErrorCodes

Altri metodi dell'API Play Core

Di seguito sono riportati alcuni metodi dell'API aggiuntivi che puoi utilizzare nella tua app.

Controlla le dimensioni di download

Controlla le dimensioni di un AssetBundle effettuando una chiamata asincrona a Google Play e impostare un metodo di callback per il completamento dell'operazione:

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

Rimuovi AssetBundle

Puoi rimuovere gli AssetBundle rapidi e on demand che al momento non sono in memoria. Effettua la seguente chiamata asincrona e imposta un callback quando viene completato:

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

Passaggi successivi

Testa la pubblicazione degli asset localmente e da su Google Play.