Öğe yayınını entegre etme (Unity)

Öğe teslimini entegre ederken Unity oyunları Addressables veya AssetBundles kullanarak öğe paketlerine erişebilir. Adresler, Unity ile geliştirilen oyunlar için daha yeni ve önerilen öğe yayınlama çözümü 2019.4 veya sonraki sürümler, AssetBundles ise Unity'de öğe paketleri için destek sağlar 2017.4 ve 2018.4.

Unity Adreslenebilir Öğeleri

Unity 2019.4 veya sonraki bir sürümle geliştirilen oyunlar Adresler ürün lansmanı için ödeme yaparsınız. Unity, Play Asset Delivery (PAD) API'si sağlar . DMAIC ve Yalın Altı Sigma yaklaşımının Adresler için aşağıdakilere bakın:

AssetBundle dosyalarını kullanma

Unity 2017.4 ve 2018.4 ile oluşturulan oyunlar, öğe için AssetBundle dosyalarını kullanabilir ve Android'de yayınlanır. Üçlü AssetBundle dosyaları, seçiliyken Unity motoru tarafından yüklenebilen serileştirilmiş öğeler içerirken görebilirsiniz. Bu dosyalar platforma özgüdür (örneğin, Android) ve öğe paketleriyle birlikte kullanılabilir. En yaygın olarak, bir AssetBundle dosyası, kendi paketiyle birlikte ve AssetBundle ile aynı adı kullanabilirsiniz. Bir öğe paketi API'yi kullanarak öğe paketini yapılandırın.

Çalışma zamanında Unity için Play Asset Delivery'yi kullanın. sınıfını kullanır.

Ön koşullar

  1. Play Asset Delivery Unity Eklentisinin en son sürümünü şunun için Google paketlerinden indirin: Unity'yi tıklayın.

  2. Unity'de AssetBundles oluşturun.

Kullanıcı arayüzünü kullanarak AssetBundles'ı yapılandırma

  1. Bir öğe paketindeki her bir AssetBundle'ı yapılandırın:

    1. Google > Android App Bundle > Öğe Yayınlama Ayarları'nı tıklayın.
    2. Doğrudan AssetBundle dosyalarını içeren klasörleri seçmek için Ekle'yi tıklayın. Klasör.

  2. Her paket için İletim Modunu Yükleme Süresi, Hızlı Takip Edin veya İsteğe Bağlı. Hataları veya bağımlılıkları çözün ve penceresini kapatın.

  3. Google > Uygulama paketini oluşturmak için Android App Bundle'ı oluşturun.

  4. (İsteğe bağlı) Uygulama paketinizi farklı dokuyu destekleyecek şekilde yapılandırın biçimleriyle ilgili daha fazla bilgi edinin.

API kullanarak öğe paketlerini yapılandırma

Öğe yayınlamayı, bir parçası olarak çalıştırılabilen düzenleyici komut dosyalarını kullanarak yapılandırabilirsiniz. otomatik bir derleme sistemidir.

Şunu kullanın: AssetPackConfig sınıfını da kullanabilir. tercih edebilirsiniz. Bu öğe paketlerinin AssetBundle öğesi.

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

Statik öğeleri de BuildBundle öğe içeren Android App Bundle oluşturmak için Bundletool sınıfındaki yöntem paket, verilen Derleme Oynatıcı Seçenekleri ve AssetPackConfig.

Rehberli eğitim için bkz. Unity oyunları Codelab'de Play Asset Delivery'yi kullanma.

Play Asset Delivery Unity API ile entegrasyon

İlgili içeriği oluşturmak için kullanılan Play Asset Delivery Unity API'si öğe paketleri isteme, indirmeleri yönetme ve öğelere erişmektir. Öncelikle projenize Unity eklentisini eklediğinizden emin olun.

API'de kullanacağınız işlevler, oluşturma işlemini nasıl öğe paketlerini seçeceğiz.

Şu durumda: Eklenti kullanıcı arayüzünü kullanarak öğe paketleri oluşturabilirsiniz, Eklenti tarafından yapılandırılmış öğe paketleri'ni seçin.

Şu durumda: API'yi (veya eklenti kullanıcı arayüzünü) kullanarak öğe paketleri oluşturabilir, API ile yapılandırılmış öğe paketlerini seçin.

API'yi teslim türüne göre, seçmeniz gerekir. Bu adımlar aşağıda gösterilmektedir akış şemasıdır.

Eklentinin öğe paketi akış diyagramı

Şekil 1. Öğe paketlerine erişim için akış şeması

AssetBundles Alma

Play Asset Delivery kitaplığı ve RetrieveAssetBundleAsync() yöntemini kullanın.

using Google.Play.AssetDelivery;

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

Yükleme zamanında teslimat

install-time olarak yapılandırılan öğe paketleri uygulamada hemen kullanılabilir lansman sonrasında gerçekleşebilir. AssetBundle'dan bir sahne yüklemek için aşağıdakileri kullanabilirsiniz:

AssetBundle assetBundle = bundleRequest.AssetBundle;

// You may choose to load scenes from the AssetBundle. For example:
string[] scenePaths = assetBundle.GetAllScenePaths();
SceneManager.LoadScene(scenePaths[path-index]);

Hızlı takip ve isteğe bağlı teslimat

Bu bölümler fast-follow ve on-demand öğe paketleri için geçerlidir.

Durumu denetle

Her öğe paketi, uygulamanın dahili depolama alanında ayrı bir klasörde depolanır. Şunu kullanın: isDownloaded() yöntemini kullanarak bir öğe paketinin önceden indirilip indirilmediğini belirleyebilirsiniz.

İndirme işlemini izleme

Sorgu PlayAssetBundleRequest nesnesini tanımlayın:

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

Büyük boyutlu indirme işlemleri

200 MB'tan büyük öğe paketleri yalnızca kablosuz ağa bağlıyken otomatik olarak indirilebilir. Eğer kullanıcı kablosuz ağa bağlı değilse PlayAssetBundleRequest durumu AssetDeliveryStatus.WaitingForWifi ve indirme işlemi duraklatılır. Bu durumda, cihaz bağlanana kadar bekleyin kablosuz ağa bağlanarak, indirme işlemini devam ettirebilir veya kullanıcıdan uygulamayı indirmek için bir bağlantı üzerinden paketleyin.

Zorunlu kullanıcı onayı

Bir paket AssetDeliveryStatus.RequiresUserConfirmation durumundaysa görüntülenen iletişim kutusunu kabul edene kadar indirme işlemi devam etmez PlayAssetDelivery.ShowConfirmationDialog(). Bu durum, uygulamanın Play tarafından tanınmaz. Aramanın Bu durumda PlayAssetDelivery.ShowConfirmationDialog(), uygulamanın güncellenecektir. Güncellemeden sonra öğeleri tekrar isteyin.

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

İsteği iptal etme (yalnızca isteğe bağlı)

AssetBundles öğesi aşağıdaki öğeler yüklenmeden önce isteği iptal etmeniz gerekirse: çağırın, AttemptCancel() yöntemini PlayAssetBundleRequest nesne:

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

Öğe paketlerini eşzamansız olarak isteme

Çoğu durumda Koordinatlar: öğe paketlerini eşzamansız olarak isteme ve takip etmek için:

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;

Hataların işlenmesi hakkında daha fazla bilgi için AssetDeliveryErrorCodes.

Diğer Play Core API yöntemleri

Aşağıda, uygulamanızda kullanmak isteyebileceğiniz bazı ek API yöntemleri verilmiştir.

İndirme boyutunu kontrol edin

Google Play'e eşzamansız bir çağrı yaparak AssetBundle öğesinin boyutunu kontrol edin ve işlemin tamamlandığı zaman kullanılacak bir geri çağırma yöntemi belirleyin:

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 kaldırma

Şu anda etkin olmayan hızlı takip eden ve isteğe bağlı AssetBundles öğelerini kaldırabilirsiniz. belleğe yüklenir. Aşağıdaki eşzamansız çağrıyı yapın ve bir geri çağırma ayarlayın yöntemini kullanın:

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

Sonraki adımlar

Öğe teslimini yerel olarak ve Google Play