ऐसेट डिलीवरी (Unity) को इंटिग्रेट करना

ऐसेट डिलीवरी को इंटिग्रेट करते समय, Unity गेम, Addressables या AssetBundles का इस्तेमाल करके ऐसेट पैक ऐक्सेस कर सकते हैं. Unity 2019.4 या इसके बाद के वर्शन में बनाए गए गेम के लिए, Addressables सबसे नया और सुझाया गया एसेट डिलीवरी सलूशन है. वहीं, AssetBundles, Unity 2017.4 और 2018.4 में एसेट पैक के साथ काम करते हैं.

Unity Addressables

Unity 2019.4 या इसके बाद के वर्शन में बनाए गए गेम को Android पर एसेट डिलीवरी के लिए, Addressables का इस्तेमाल करना चाहिए. Unity, Addressables का इस्तेमाल करके Android ऐसेट पैक को मैनेज करने के लिए, Play ऐसेट डिलीवरी (PAD) एपीआई उपलब्ध कराता है. Addressable का इस्तेमाल करने के बारे में जानकारी के लिए, ये लेख पढ़ें:

AssetBundle फ़ाइलों का इस्तेमाल करना

Unity 2017.4 और 2018.4 का इस्तेमाल करके बनाए गए गेम, Android पर ऐसेट डिलीवरी के लिए AssetBundle फ़ाइलों का इस्तेमाल कर सकते हैं. UnityAssetBundle फ़ाइलों में, सीरियलाइज़ की गई ऐसेट होती हैं. ऐप्लिकेशन के चलने के दौरान, Unity इंजन इन ऐसेट को लोड कर सकता है. ये फ़ाइलें प्लैटफ़ॉर्म के हिसाब से होती हैं. उदाहरण के लिए, Android के लिए बनाई गई. इनका इस्तेमाल ऐसेट पैक के साथ किया जा सकता है. आम तौर पर, एक AssetBundle फ़ाइल को एक ऐसेट पैक में पैकेज किया जाता है. पैक में, AssetBundle के नाम का ही इस्तेमाल किया जाता है. अगर आपको एसेट पैक बनाने में ज़्यादा सुविधाएं चाहिए, तो एपीआई का इस्तेमाल करके एसेट पैक को कॉन्फ़िगर करें.

रनटाइम के दौरान, ऐसेट पैक में पैकेज किए गए AssetBundle को वापस पाने के लिए, Unity के लिए Play की ऐसेट डिलीवरी क्लास का इस्तेमाल करें.

ज़रूरी शर्तें

  1. अपना डेवलपमेंट एनवायरमेंट सेट अप करें:

OpenUPM-CLI

अगर आपने OpenUPM CLI इंस्टॉल किया है, तो इस कमांड का इस्तेमाल करके OpenUPM रजिस्ट्री इंस्टॉल की जा सकती है:

openupm add com.google.play.assetdelivery

OpenUPM

  1. Unity मेन्यू विकल्प बदलाव करें > प्रोजेक्ट सेटिंग > पैकेज मैनेजर चुनकर, पैकेज मैनेजर की सेटिंग खोलें.

  2. पैकेज मैनेजर विंडो में, OpenUPM को स्कोप वाली रजिस्ट्री के तौर पर जोड़ें:

    Name: package.openupm.com
    URL: https://package.openupm.com
    Scopes: com.google.external-dependency-manager
      com.google.play.common
      com.google.play.core
      com.google.play.assetdelivery
      com.google.android.appbundle
    
  3. यूनिटी मेन्यू में विंडो > पैकेज मैनेजर चुनकर, पैकेज मैनेजर मेन्यू खोलें.

  4. मेरी रजिस्ट्री चुनने के लिए, मैनेजर के दायरे का ड्रॉप-डाउन सेट करें.

  5. पैकेज की सूची से, Unity के लिए Google Play इंटिग्रिटी प्लगिन पैकेज चुनें और इंस्टॉल करें दबाएं.

GitHub से इंपोर्ट करना

  1. GitHub से .unitypackage की सबसे नई रिलीज़ डाउनलोड करें.

  2. .unitypackage फ़ाइल को इंपोर्ट करने के लिए, यूनिटी मेन्यू का विकल्प चुनें ऐसेट > पैकेज इंपोर्ट करें > कस्टम पैकेज और सभी आइटम इंपोर्ट करें.

  1. Unity में AssetBundles बनाना.

यूज़र इंटरफ़ेस (यूआई) का इस्तेमाल करके, AssetBundles कॉन्फ़िगर करना

  1. ऐसेट पैक में हर AssetBundle को कॉन्फ़िगर करें:

    1. Google > Android ऐप्लिकेशन बंडल > एसेट डिलीवरी सेटिंग चुनें.
    2. ऐसे फ़ोल्डर चुनने के लिए जिनमें सीधे तौर पर AssetBundle फ़ाइलें मौजूद हैं, फ़ोल्डर जोड़ें पर क्लिक करें.

  2. हर बंडल के लिए, डिलीवरी मोड को इंस्टॉल के समय, फ़ास्ट फ़ॉलो या मांग पर उपलब्ध पर सेट करें. सभी गड़बड़ियां या डिपेंडेंसी ठीक करें और विंडो को बंद करें.

  3. ऐप्लिकेशन बंडल बनाने के लिए, Google > Android ऐप्लिकेशन बंडल बनाएं को चुनें.

  4. (ज़रूरी नहीं) अपने ऐप्लिकेशन बंडल को अलग-अलग टेक्स्चर के कम्प्रेशन फ़ॉर्मैट के साथ काम करने के लिए कॉन्फ़िगर करें.

एपीआई का इस्तेमाल करके ऐसेट पैक कॉन्फ़िगर करना

ऐसेट डिलीवरी को एडिटर स्क्रिप्ट की मदद से कॉन्फ़िगर किया जा सकता है. इन्हें अपने-आप बिल्ड होने वाले सिस्टम के हिस्से के तौर पर चलाया जा सकता है.

Android ऐप्लिकेशन बंडल के बिल्ड में कौनसी ऐसेट शामिल करनी हैं, यह तय करने के लिए AssetPackConfig क्लास का इस्तेमाल करें. साथ ही, ऐसेट के डिलीवरी मोड के बारे में भी बताएं. इन एसेट पैक में, 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);
}

Bundletool क्लास में मौजूद स्टैटिक BuildBundle तरीका का इस्तेमाल करके भी, ऐसेट पैक के साथ Android ऐप्लिकेशन बंडल जनरेट किया जा सकता है. इसके लिए, BuildPlayerOptions और AssetPackConfig की ज़रूरत होती है.

निर्देशों वाला ट्यूटोरियल पाने के लिए, Unity गेम में Play ऐसेट डिलीवरी का इस्तेमाल करने के बारे में जानकारी देने वाला कोडलैब देखें.

Play ऐसेट डिलीवरी Unity API के साथ इंटिग्रेट करना

Play ऐसेट डिलीवरी Unity API, ऐसेट पैक का अनुरोध करने, डाउनलोड मैनेज करने, और ऐसेट ऐक्सेस करने की सुविधा देता है. सबसे पहले, अपने प्रोजेक्ट में Unity प्लगिन जोड़ना न भूलें.

एपीआई में इस्तेमाल किए जाने वाले फ़ंक्शन इस बात पर निर्भर करते हैं कि आपने एसेट पैक कैसे बनाए हैं.

अगर आपने प्लग इन के यूज़र इंटरफ़ेस (यूआई) का इस्तेमाल करके ऐसेट पैक बनाए हैं, तो प्लग इन से कॉन्फ़िगर किए गए ऐसेट पैक चुनें.

अगर आपने एपीआई (या प्लग इन यूज़र इंटरफ़ेस) का इस्तेमाल करके एसेट पैक बनाए हैं, तो एपीआई से कॉन्फ़िगर किए गए एसेट पैक चुनें.

आपको जिस ऐसेट पैक को ऐक्सेस करना है, उसकी डिलीवरी टाइप के बावजूद एपीआई एक जैसा ही होता है. इन चरणों को नीचे दिए गए फ़्लोचार्ट में दिखाया गया है.

एपीआई के लिए ऐसेट पैक का फ़्लो डायग्राम

पहली इमेज. ऐसेट पैक को ऐक्सेस करने के लिए फ़्लो डायग्राम

ऐसेट पैक को वापस लाना

अगर ऐसेट पैक का नया वर्शन डिस्क पर पहले से उपलब्ध नहीं है, तो Play ऐसेट डिलीवरी लाइब्रेरी को इंपोर्ट करें और ऐसेट पैक डाउनलोड करने के लिए, RetrieveAssetPackAsync() का तरीका अपनाएं.

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

ऐप्लिकेशन इंस्टॉल करते समय डिलीवरी

install-time के तौर पर कॉन्फ़िगर किया गया ऐसेट पैक, ऐप्लिकेशन के लॉन्च होने पर तुरंत उपलब्ध हो जाता है. हालांकि, आपको इसकी ऐसेट को मेमोरी में लोड करना होगा. मेमोरी में ऐसेट लोड करना देखें.

फ़ास्ट-फ़ॉलो और मांग पर डिलीवरी

ये सेक्शन, fast-follow और on-demand एसेट पैक पर लागू होते हैं.

स्थिति देखें

हर ऐसेट पैक को ऐप्लिकेशन के इंटरनल स्टोरेज में एक अलग फ़ोल्डर में सेव किया जाता है. isDone() के तरीके का इस्तेमाल करके यह पता लगाएं कि कोई ऐसेट पैक पहले से डाउनलोड किया जा चुका है और उपलब्ध है या कोई गड़बड़ी हुई है.

डाउनलोड को मॉनिटर करना

अनुरोध की स्थिति को मॉनिटर करने के लिए, PlayAssetPackRequest ऑब्जेक्ट से क्वेरी करें:

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

बड़ी फ़ाइलें डाउनलोड करना

200 एमबी से बड़े ऐसेट पैक अपने-आप डाउनलोड हो सकते हैं. हालांकि, ऐसा सिर्फ़ तब होगा, जब डिवाइस वाई-फ़ाई से कनेक्ट हो. अगर उपयोगकर्ता वाई-फ़ाई का इस्तेमाल नहीं कर रहा है, तो PlayAssetPackRequest के स्टेटस को AssetDeliveryStatus.WaitingForWifi पर सेट कर दिया जाता है. साथ ही, डाउनलोड को रोक दिया जाता है. इस मामले में, डिवाइस के वाई-फ़ाई से कनेक्ट होने तक इंतज़ार करें और डाउनलोड फिर से शुरू करें. इसके अलावा, उपयोगकर्ता से मोबाइल डेटा का इस्तेमाल करके पैक डाउनलोड करने की अनुमति मांगें.

उपयोगकर्ता की पुष्टि करना ज़रूरी है

अगर किसी पैक का स्टेटस AssetDeliveryStatus.RequiresUserConfirmation है, तो PlayAssetDelivery.ShowConfirmationDialog() के साथ दिखाए गए डायलॉग को स्वीकार करने तक, डाउनलोड की प्रोसेस शुरू नहीं होगी. यह स्टेटस तब दिख सकता है, जब Play ने ऐप्लिकेशन की पहचान न की हो. ध्यान दें कि इस मामले में PlayAssetDelivery.ShowConfirmationDialog() को कॉल करने पर, ऐप्लिकेशन अपडेट हो जाता है. अपडेट करने के बाद, ऐसेट का फिर से अनुरोध करें.

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

अनुरोध रद्द करना (सिर्फ़ ऑन-डिमांड)

अगर आपको ऐसेट पैक डाउनलोड होने से पहले अनुरोध रद्द करना है, तो PlayAssetPackRequest ऑब्जेक्ट पर AttemptCancel() तरीका कॉल करें:

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

ऐसेट को मेमोरी में लोड करना

अनुरोध पूरा होने के बाद, ऐसेट को मेमोरी में लोड करने के लिए, इनमें से किसी एक फ़ंक्शन का इस्तेमाल करें:

  • AssetLocation ऑब्जेक्ट पाने के लिए, PlayAssetPackRequest.GetAssetLocation() का इस्तेमाल करें. इससे ऐसेट का पाथ, ऑफ़सेट, और साइज़ पता चलता है, ताकि उसे डिस्क से लोड किया जा सके.
  • अगर ऐसेट एक AssetBundle है, तो आसानी से इस्तेमाल किए जा सकने वाले तरीके का इस्तेमाल किया जा सकता है PlayAssetPackRequest.LoadAssetBundleAsync(assetPath). आपने जो ऐसेट पाथ डाला है वह ऐसेट पैक में मौजूद AssetBundle के पाथ से मेल खाना चाहिए. इससे AssetBundleCreateRequest मिलेगा.

ऐसेट पैक के लिए एसिंक्रोनस रिक्वेस्ट करना

ज़्यादातर मामलों में, आपको एसेट पैक का अनुरोध करने और प्रोग्रेस पर नज़र रखने के लिए, कोरूटीन का इस्तेमाल करना चाहिए. इस बारे में यहां बताया गया है:

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;

गड़बड़ियों को ठीक करने के बारे में ज़्यादा जानकारी के लिए, गड़बड़ी के कोड की सूची देखें.

Play Core API के अन्य तरीके

यहां एपीआई के कुछ अन्य तरीके दिए गए हैं. इनका इस्तेमाल, अपने ऐप्लिकेशन में किया जा सकता है.

एक से ज़्यादा ऐसेट पैक वापस लाना

एक साथ कई ऐसेट पैक वापस पाने के लिए, इस फ़ंक्शन का इस्तेमाल करें:

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

हर अनुरोध की स्थिति को मॉनिटर करने के लिए, स्टेटस के Dictionary की जांच करें:

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

डाउनलोड साइज़ देखना

Google Play को असाइनोक्रोनस कॉल करके, एसेट पैक का साइज़ देखें और ऑपरेशन पूरा होने पर कॉलबैक का तरीका सेट करें:

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 हटाना

फ़ास्ट-फ़ॉलो और ऑन-डिमांड ऐसेट पैक को हटाया जा सकता है, जो फ़िलहाल मेमोरी में लोड नहीं किए गए हैं. नीचे दिया गया असाइनिश्नल कॉल करें और इसके पूरा होने पर कॉलबैक तरीका सेट करें:

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

अगले चरण

स्थानीय तौर पर और Google Play से, एसेट डिलीवरी की जांच करें.