Unity Games, öğe teslimini entegre ederken Addressables veya AssetBundles kullanarak öğe paketlerine erişebilir. Adreslenebilirler, Unity 2019.4 veya sonraki bir sürümle oluşturulan oyunlar için daha yeni ve önerilen öğe teslimi çözümüdür. AssetBundles ise Unity 2017.4 ve 2018.4 sürümlerinde öğe paketlerini destekler.
Unity Adreslenebilirler
Unity 2019.4 veya sonraki sürümler ile oluşturulan oyunlar, Android'de öğe yayınlama için Adreslenebilirler'i kullanmalıdır. Unity, Adreslenebilirler'i kullanarak Android öğe paketlerini işlemek için bir Play Asset Delivery (PAD) API'si sağlar. Addressables'ı kullanma hakkında bilgi için aşağıdakilere bakın:
- Android paketi için adreslenebilirler
- Unity için PaD kılavuzu
- Unity için PAD API referans belgeleri
AssetBundle dosyalarını kullanma
Unity 2017.4 ve 2018.4 ile oluşturulan oyunlar, Android'de öğe teslimi için AssetBundle dosyalarını kullanabilir. Unity AssetBundle dosyaları, uygulama çalışırken Unity motoru tarafından yüklenebilen, serileştirilmiş öğeler içerir. Bu dosyalar platforma özgüdür (örneğin, Android için geliştirilmiştir) ve öğe paketleriyle birlikte kullanılabilir. En yaygın şekilde, bir AssetBundle dosyası, AssetBundle ile aynı adı kullanan bir paketle tek bir öğe paketi halinde paketlenir. Öğe paketi oluştururken daha fazla esneklik istiyorsanız API'yi kullanarak öğe paketini yapılandırın.
Çalışma zamanında, öğe paketi halinde paketlenmiş bir AssetBundle almak için Unity için Play Asset Delivery sınıfını kullanın.
Ön koşullar
Unity için Google paketlerinden Play Asset Delivery Unity Eklentisinin son sürümünü indirin.
Kullanıcı arayüzünü kullanarak AssetBundles yapılandırma
Bir öğe paketindeki her AssetBundle öğesini yapılandırın:
- Google > Android App Bundle > Öğe Teslim Ayarları'nı seçin.
- Doğrudan AssetBundle dosyalarını içeren klasörleri seçmek için Klasör Ekle'yi tıklayın.
Her paket için İletim Modu'nu Yükleme Süresi, Hızlı Takip veya İsteğe Bağlı olarak değiştirin. Tüm hataları veya bağımlılıkları düzeltin ve pencereyi kapatın.
Uygulama paketini derlemek için Google > Android App Bundle Oluştur'u seçin.
(İsteğe bağlı) Uygulama paketinizi farklı doku sıkıştırma biçimlerini destekleyecek şekilde yapılandırın.
API'yi kullanarak öğe paketlerini yapılandırma
Öğe teslimini, otomatik derleme sisteminin parçası olarak çalıştırılabilecek düzenleyici komut dosyalarıyla yapılandırabilirsiniz.
Android App Bundle derlemesine hangi öğelerin dahil edileceğini ve öğelerin yayınlama modunu tanımlamak için AssetPackConfig
sınıfını kullanın. Bu öğe paketlerinin bir AssetBundle içermesine gerek yoktur.
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); }
BuildPlayerOptions ve AssetPackConfig
ile öğe paketlerine sahip bir Android App Bundle oluşturmak için Bundletool
sınıfındaki statik BuildBundle
yöntemini de kullanabilirsiniz.
Rehberli eğitim için Unity oyunları Codelab'de Play Asset Delivery'yi kullanma bölümüne bakın.
Play Asset Delivery Unity API ile entegrasyon
Play Asset Delivery Unity API, öğe paketlerini isteme, indirme işlemlerini yönetme ve öğelere erişme işlevlerini sağlar. Önce projenize Unity eklentisini ekleyin.
API'de kullandığınız işlevler, öğe paketlerini nasıl oluşturduğunuza bağlıdır.
Eklentinin kullanıcı arayüzünü kullanarak öğe paketleri oluşturduysanız Eklenti ile yapılandırılmış öğe paketleri'ni seçin.
API (veya eklenti kullanıcı arayüzünü) kullanarak öğe paketleri oluşturduysanız API ile yapılandırılmış öğe paketlerini seçin.
API, erişmek istediğiniz öğe paketinin yayınlama türünden bağımsız olarak benzerdir. Bu adımlar aşağıdaki akış şemasında gösterilmiştir.
Öğe paketi alma
Play Asset Delivery kitaplığını içe aktarın ve paketin en son sürümü diskte mevcut değilse öğe paketi indirmek için RetrieveAssetPackAsync()
yöntemini çağırın.
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);
Yükleme sırasında teslim
install-time
olarak yapılandırılan bir öğe paketi, uygulama başlatıldığında hemen kullanılabilir ancak öğelerini belleğe yüklemeniz gerekir. Öğeleri belleğe yükleme bölümünü inceleyin.
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 depolamasında ayrı bir klasörde saklanır.
Bir öğe paketinin zaten indirilip indirilmediğini ve kullanılabilir olup olmadığını veya bir hata oluşup oluşmadığını belirlemek için isDone()
yöntemini kullanın.
İndirme işlemini izleme
İsteğin durumunu izlemek için PlayAssetPackRequest
nesnesini sorgulayı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 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;
Büyük boyutlu indirmeler
200 MB'tan büyük öğe paketleri, cihaz kablosuz ağa bağlı olduğunda otomatik olarak indirilebilir. Kullanıcı kablosuz ağa bağlı değilse PlayAssetPackRequest
durumu AssetDeliveryStatus.WaitingForWifi
olarak ayarlanır ve indirme işlemi duraklatılır. Bu durumda, cihazın kablosuz ağa bağlanmasını ve indirme işlemini devam ettirmesini bekleyin ya da kullanıcıdan paketi hücresel bağlantı üzerinden indirmesi için onay isteyin.
Kullanıcı onayı gerekli
Durumu AssetDeliveryStatus.RequiresUserConfirmation
olan paketler, PlayAssetDelivery.ShowConfirmationDialog()
ile gösterilen iletişim kutusu kullanıcı tarafından kabul edilene kadar indirme işlemi devam etmez. Uygulama, Play tarafından tanınmazsa bu durum ortaya çıkabilir. Bu durumda PlayAssetDelivery.ShowConfirmationDialog()
çağrısının, uygulamanın güncellenmesine neden olduğunu unutmayın. Güncellemeden sonra öğeler için tekrar istekte bulunun.
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ı)
Öğe paketleri indirilmeden önce isteği iptal etmeniz gerekirse PlayAssetPackRequest
nesnesinde AttemptCancel()
yöntemini çağırın:
// 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. }
Öğeleri belleğe yükleme
İstek tamamlandıktan sonra öğeleri belleğe yüklemek için şu işlevlerden birini kullanın:
- Bir
AssetLocation
nesnesi almak içinPlayAssetPackRequest.GetAssetLocation()
işlevini kullanın. Bu, öğenin diskten yüklenebilmesi için öğenin yolunu, ofsetini ve boyutunu sağlar. - Öğe bir AssetBundle ise
PlayAssetPackRequest.LoadAssetBundleAsync(assetPath)
kolaylık yöntemini kullanabilirsiniz. Geçtiğiniz öğe yolu, öğe paketinin içindeki AssetBundle yoluna karşılık gelmelidir. Bu işlem bir AssetBundleCreateRequest döndürür.
Öğe paketlerini eşzamansız olarak isteme
Çoğu durumda, aşağıda gösterildiği gibi öğe paketlerini eşzamansız olarak istemek ve ilerleme durumunu izlemek için Koutinler'i kullanmanız gerekir:
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;
Hataların ele alınması hakkında daha fazla bilgi için hata kodları listesine bakın.
Diğer Play Core API yöntemleri
Aşağıda, uygulamanızda kullanmak isteyebileceğiniz bazı ek API yöntemleri verilmiştir.
Birden fazla öğe paketini al
Birden fazla öğe paketini aynı anda almak için aşağıdaki işlevi kullanın:
// assetPackNames is an array of strings corresponding to asset packs. PlayAssetPackBatchRequest batchRequest = PlayAssetDelivery.RetrieveAssetPackBatchAsync(<IListstring> assetPackNames);
Durumların Dictionary
kadarını inceleyerek her isteğin durumunu izleyin:
// 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;
İndirme boyutunu kontrol edin
Google Play'e eşzamansız bir çağrı yaparak ve işlem tamamlandığında bir geri çağırma yöntemi ayarlayarak öğe paketinin boyutunu kontrol edin:
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 belleğe yüklenmemiş olan hızlı takip ve isteğe bağlı öğe paketlerini kaldırabilirsiniz. Aşağıdaki eşzamansız çağrıyı yapın ve tamamlandığında bir geri çağırma yöntemi ayarlayı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
Yerel olarak ve Google Play'den öğe yayınını test edin.