Integrare la pubblicazione degli asset (Unity)

Quando integri la distribuzione degli asset, i giochi Unity possono accedere a pacchetti di asset. Gli indirizzi disponibili sono la soluzione di distribuzione degli asset più recente e consigliata per i giochi creati con Unity 2019.4 o versioni successive, mentre gli AssetBundles supportano i pacchetti di asset in Unity 2017.4 e 2018.4.

Indirizzi Unity

I giochi creati con Unity 2019.4 o versioni successive dovrebbero utilizzare Addressables per il caricamento degli asset su Android. Unity fornisce un'API Play Asset Delivery (PAD) per la gestione dei pacchetti di asset Android utilizzando gli indirizzi. Per informazioni sull'utilizzo di Indirizzi, consulta quanto segue:

Utilizzare i file AssetBundle

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

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

Prerequisiti

  1. Scarica l'ultima release 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 ogni 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, Seguire velocemente o On demand. Risolvi eventuali errori o dipendenze e chiudi la finestra.

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

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

Configurare i pacchetti di asset utilizzando l'API

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

Utilizza la classe AssetPackConfig per definire quali asset includere in una build di Android App Bundle, nonché la modalità di invio degli asset. Questi asset pack 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 utilizzare il metodo BuildBundle statico nella classe Bundletool per generare un Android App Bundle con pacchetti di asset, in BuildPlayerOptions e AssetPackConfig.

Per un tutorial guidato, consulta il codelab su come utilizzare Play Asset Delivery nei giochi Unity.

Integrazione con l'API Play Asset Delivery Unity

L'API Play Asset Delivery Unity fornisce la funzionalità per richiedere pacchetti di asset, gestire i download e accedere agli asset. Assicurati prima di aggiungere il plug-in Unity al tuo progetto.

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

Se hai creato asset pack utilizzando l'interfaccia utente dei plug-in, seleziona Pacchetti di asset configurati per i plug-in.

Se hai creato pacchetti di asset utilizzando l'API (o la UI del plug-in), seleziona Pacchetti di asset configurati tramite API.

L'API è simile indipendentemente dal tipo di pubblicazione del pacchetto di asset a cui vuoi accedere. Questi passaggi sono mostrati nel diagramma di flusso riportato di seguito.

Diagramma di flusso del pacchetto di asset per l'API

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

Recupera un pacchetto di asset

Importa la raccolta di asset di Google Play e chiama il metodo RetrieveAssetPackAsync() per scaricare un pacchetto di asset, se la versione più recente del pacchetto non è già disponibile su disco.

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

Consegna al momento dell'installazione

Un pacchetto di asset configurato come install-time è immediatamente disponibile al momento dell'avvio dell'app, ma devi caricarne gli asset in memoria. Vedi Caricare asset nella memoria.

Distribuzione rapida 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 il metodo isDone() per determinare se un pacchetto di asset è già stato scaricato ed è disponibile o se si è verificato un errore.

Monitorare il download

Esegui una query sull'oggetto PlayAssetPackRequest 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 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;

Download di grandi dimensioni

I pacchetti di asset di dimensioni superiori a 200 MB possono essere scaricati automaticamente, ma solo se il dispositivo è connesso a una rete Wi-Fi. Se l'utente non è connesso al Wi-Fi, lo stato PlayAssetPackRequest è impostato su AssetDeliveryStatus.WaitingForWifi e il download viene messo in pausa. In questo caso, attendi che il dispositivo si connetta alla rete Wi-Fi, riprendi il download o chiedi all'utente l'approvazione per scaricare il pacchetto tramite una rete cellulare.

Conferma dell'utente obbligatoria

Se un pacchetto ha lo stato AssetDeliveryStatus.RequiresUserConfirmation, il download non continuerà finché l'utente non accetta la finestra di dialogo visualizzata con PlayAssetDelivery.ShowConfirmationDialog(). Questo stato può apparire se l'app non viene riconosciuta da Google Play. Tieni presente che la chiamata a PlayAssetDelivery.ShowConfirmationDialog() in questo caso comporta l'aggiornamento dell'app. Dopo l'aggiornamento, richiedi di nuovo 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 che i pacchetti di asset vengano scaricati, chiama il metodo AttemptCancel() sull'oggetto PlayAssetPackRequest:

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

Carica asset nella memoria

Una volta completata la richiesta, utilizza una delle seguenti funzioni per caricare gli asset in memoria:

Richiedi pacchetti di asset in modo asincrono

Nella maggior parte dei casi, devi utilizzare le coroutine per richiedere pacchetti di asset in modo asincrono e monitorare l'avanzamento, come mostrato di seguito:

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;

Per ulteriori informazioni sulla gestione degli errori, consulta l'elenco dei codici di errore.

Altri metodi dell'API Play Core

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

Recupera più pacchetti di asset

Per recuperare più pacchetti di asset contemporaneamente, utilizza la seguente funzione:

// assetPackNames is an array of strings corresponding to asset packs.
PlayAssetPackBatchRequest batchRequest = PlayAssetDelivery.RetrieveAssetPackBatchAsync(<IListstring> assetPackNames);

Monitora gli stati di ogni richiesta ispezionando Dictionary di stati:

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

Controlla dimensioni download

Controlla le dimensioni di un pacchetto di asset effettuando una chiamata asincrona a Google Play e impostando 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 i pacchetti di asset fast-follow e on demand che al momento non sono caricati in memoria. Effettua la seguente chiamata asincrona e imposta un metodo di callback per il completamento:

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 in locale e da Google Play.