ইন্টিগ্রেট অ্যাসেট ডেলিভারি (ইউনিটি)

অ্যাসেট ডেলিভারি ইন্টিগ্রেট করার সময়, ইউনিটি গেমগুলো অ্যাড্রেসেবল (Addressables) বা অ্যাসেটবান্ডেল (AssetBundles) ব্যবহার করে অ্যাসেট প্যাক অ্যাক্সেস করতে পারে। ইউনিটি ২০১৯.৪ বা তার উচ্চতর সংস্করণে তৈরি গেমের জন্য অ্যাড্রেসেবল হলো অপেক্ষাকৃত আধুনিক এবং প্রস্তাবিত অ্যাসেট ডেলিভারি সমাধান, অন্যদিকে ইউনিটি ২০১৭.৪ এবং ২০১৮.৪-এ অ্যাসেটবান্ডেল অ্যাসেট প্যাক সাপোর্ট করে।

ইউনিটি অ্যাড্রেসেবলস

ইউনিটি ২০১৯.৪ বা তার উচ্চতর সংস্করণ দিয়ে তৈরি গেমগুলোতে অ্যান্ড্রয়েডে অ্যাসেট ডেলিভারির জন্য অ্যাড্রেসেবলস (Addressables) ব্যবহার করা উচিত। অ্যাড্রেসেবলস ব্যবহার করে অ্যান্ড্রয়েড অ্যাসেট প্যাক পরিচালনার জন্য ইউনিটি একটি প্লে অ্যাসেট ডেলিভারি (PAD) এপিআই (API) প্রদান করে। অ্যাড্রেসেবলস ব্যবহার সম্পর্কে তথ্যের জন্য, নিম্নলিখিতগুলো দেখুন:

অ্যাসেটবান্ডল ফাইল ব্যবহার করুন

ইউনিটি ২০১৭.৪ এবং ২০১৮.৪ দিয়ে তৈরি গেমগুলো অ্যান্ড্রয়েডে অ্যাসেট ডেলিভারির জন্য অ্যাসেটবান্ডেল ফাইল ব্যবহার করতে পারে। ইউনিটি অ্যাসেটবান্ডেল ফাইলগুলোতে সিরিয়ালাইজড অ্যাসেট থাকে, যা অ্যাপ চলার সময় ইউনিটি ইঞ্জিন লোড করতে পারে। এই ফাইলগুলো প্ল্যাটফর্ম-নির্দিষ্ট (উদাহরণস্বরূপ, অ্যান্ড্রয়েডের জন্য তৈরি) এবং অ্যাসেট প্যাকের সাথে একত্রে ব্যবহার করা যায়। সাধারণত, একটি অ্যাসেটবান্ডেল ফাইলকে একটি একক অ্যাসেট প্যাকে প্যাকেজ করা হয় এবং প্যাকটির নাম অ্যাসেটবান্ডেলের নামের মতোই থাকে। অ্যাসেট প্যাক তৈরিতে আরও বেশি নমনীয়তা চাইলে, এপিআই (API) ব্যবহার করে অ্যাসেট প্যাকটি কনফিগার করুন।

রানটাইমে, অ্যাসেট প্যাকে প্যাকেজ করা একটি অ্যাসেটবান্ডেল পুনরুদ্ধার করতে `Play Asset Delivery for Unity` ক্লাসটি ব্যবহার করুন।

পূর্বশর্ত

  1. আপনার ডেভেলপমেন্ট এনভায়রনমেন্ট সেট আপ করুন:

ওপেনইউপিএম-সিএলআই

আপনার যদি OpenUPM CLI ইনস্টল করা থাকে, তাহলে আপনি নিম্নলিখিত কমান্ডটি ব্যবহার করে OpenUPM রেজিস্ট্রি ইনস্টল করতে পারেন:

openupm add com.google.play.assetdelivery

ওপেনইউপিএম

  1. ইউনিটি মেনু অপশন Edit > Project Settings > Package Manager নির্বাচন করে প্যাকেজ ম্যানেজার সেটিংস খুলুন।

  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. ইউনিটি মেনু অপশন Window > Package Manager নির্বাচন করে প্যাকেজ ম্যানেজার মেনুটি খুলুন।

  4. ম্যানেজার স্কোপ ড্রপ-ডাউন থেকে 'আমার রেজিস্ট্রি' নির্বাচন করুন।

  5. প্যাকেজ তালিকা থেকে ইউনিটির জন্য গুগল প্লে ইন্টিগ্রিটি প্লাগইন প্যাকেজটি নির্বাচন করুন এবং ইনস্টল চাপুন।

গিটহাব থেকে আমদানি করুন

  1. গিটহাব থেকে সর্বশেষ .unitypackage রিলিজটি ডাউনলোড করুন।

  2. ইউনিটি মেনু অপশন Assets > Import package > Custom Package নির্বাচন করে সমস্ত আইটেম ইম্পোর্ট করার মাধ্যমে .unitypackage ফাইলটি ইম্পোর্ট করুন।

  1. ইউনিটিতে অ্যাসেটবান্ডেল তৈরি করুন

UI ব্যবহার করে অ্যাসেটবান্ডেলগুলি কনফিগার করুন

  1. একটি অ্যাসেট প্যাকে থাকা প্রতিটি অ্যাসেটবান্ডেল কনফিগার করুন:

    1. Google > Android App Bundle > Asset Delivery Settings নির্বাচন করুন।
    2. যেসব ফোল্ডারে সরাসরি অ্যাসেটবান্ডেল ফাইল রয়েছে, সেগুলো নির্বাচন করতে ‘অ্যাড ফোল্ডার’-এ ক্লিক করুন।

  2. প্রতিটি বান্ডেলের জন্য, ডেলিভারি মোড পরিবর্তন করে ইনস্টল টাইম , ফাস্ট ফলো বা অন ডিমান্ড করুন । যেকোনো ত্রুটি বা নির্ভরশীলতা সমাধান করুন এবং উইন্ডোটি বন্ধ করুন।

  3. অ্যাপ বান্ডেলটি তৈরি করতে Google > Build Android App Bundle নির্বাচন করুন।

  4. (ঐচ্ছিক) বিভিন্ন টেক্সচার কম্প্রেশন ফরম্যাট সমর্থন করার জন্য আপনার অ্যাপ বান্ডেলটি কনফিগার করুন।

এপিআই ব্যবহার করে অ্যাসেট প্যাক কনফিগার করুন

আপনি এডিটর স্ক্রিপ্টের মাধ্যমে অ্যাসেট ডেলিভারি কনফিগার করতে পারেন, যা একটি স্বয়ংক্রিয় বিল্ড সিস্টেমের অংশ হিসেবে চালানো যায়।

একটি অ্যান্ড্রয়েড অ্যাপ বান্ডেল বিল্ডে কোন কোন অ্যাসেট অন্তর্ভুক্ত করা হবে এবং অ্যাসেটগুলোর ডেলিভারি মোড কী হবে, তা নির্ধারণ করতে 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);
}

আপনি BuildPlayerOptions এবং AssetPackConfig দেওয়া থাকলে, অ্যাসেট প্যাক সহ একটি অ্যান্ড্রয়েড অ্যাপ বান্ডেল তৈরি করতে Bundletool ক্লাসের স্ট্যাটিক BuildBundle মেথডটিও ব্যবহার করতে পারেন।

নির্দেশিত টিউটোরিয়ালের জন্য, "Using Play Asset Delivery in Unity games" কোডল্যাবটি দেখুন।

প্লে অ্যাসেট ডেলিভারি ইউনিটি এপিআই-এর সাথে একীভূত করুন

প্লে অ্যাসেট ডেলিভারি ইউনিটি এপিআই অ্যাসেট প্যাকের জন্য অনুরোধ করা, ডাউনলোড পরিচালনা করা এবং অ্যাসেটগুলো অ্যাক্সেস করার কার্যকারিতা প্রদান করে। প্রথমে আপনার প্রোজেক্টে ইউনিটি প্লাগইনটি যোগ করে নিন

আপনি এপিআই-তে যে ফাংশনগুলো ব্যবহার করেন, তা নির্ভর করে আপনি কীভাবে অ্যাসেট প্যাকগুলো তৈরি করেছেন তার ওপর।

আপনি যদি প্লাগইন UI ব্যবহার করে অ্যাসেট প্যাক তৈরি করে থাকেন , তাহলে ‘প্লাগইন-কনফিগার করা অ্যাসেট প্যাক’ নির্বাচন করুন।

আপনি যদি এপিআই (বা প্লাগইন ইউআই) ব্যবহার করে অ্যাসেট প্যাক তৈরি করে থাকেন , তাহলে এপিআই-কনফিগার করা অ্যাসেট প্যাক নির্বাচন করুন।

আপনি যে অ্যাসেট প্যাকটি অ্যাক্সেস করতে চান, তার ডেলিভারি টাইপ অনুযায়ী এপিআই (API) প্রয়োগ করতে হবে। এই ধাপগুলো নিম্নলিখিত ফ্লোচার্টে দেখানো হয়েছে।

প্লাগইনের জন্য অ্যাসেট প্যাক ফ্লো ডায়াগ্রাম

চিত্র ১. অ্যাসেট প্যাক অ্যাক্সেস করার ফ্লো ডায়াগ্রাম

অ্যাসেটবান্ডেল পুনরুদ্ধার করুন

Play Asset Delivery লাইব্রেরিটি ইম্পোর্ট করুন এবং একটি AssetBundle পুনরুদ্ধার করতে RetrieveAssetBundleAsync() মেথডটি কল করুন।

using Google.Play.AssetDelivery;

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

ইনস্টল-টাইম ডেলিভারি

install-time হিসেবে কনফিগার করা অ্যাসেট প্যাকগুলো অ্যাপ চালু হওয়ার সাথে সাথেই উপলব্ধ হয়। অ্যাসেটবান্ডেল থেকে একটি সিন লোড করতে আপনি নিম্নলিখিতটি ব্যবহার করতে পারেন:

AssetBundle assetBundle = bundleRequest.AssetBundle;

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

দ্রুত অনুসরণ এবং চাহিদা অনুযায়ী ডেলিভারি

এই বিভাগগুলো fast-follow এবং on-demand অ্যাসেট প্যাকগুলোর ক্ষেত্রে প্রযোজ্য।

অবস্থা পরীক্ষা করুন

প্রতিটি অ্যাসেট প্যাক অ্যাপের অভ্যন্তরীণ স্টোরেজের একটি আলাদা ফোল্ডারে সংরক্ষিত থাকে। কোনো অ্যাসেট প্যাক আগে থেকেই ডাউনলোড করা হয়েছে কিনা তা জানতে isDownloaded() মেথডটি ব্যবহার করুন।

ডাউনলোড নিরীক্ষণ করুন

অনুরোধের অবস্থা নিরীক্ষণ করতে PlayAssetBundleRequest অবজেক্টটি কোয়েরি করুন:

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

বড় ডাউনলোড

২০০ মেগাবাইটের চেয়ে বড় অ্যাসেট প্যাকগুলো স্বয়ংক্রিয়ভাবে ডাউনলোড হতে পারে, কিন্তু শুধুমাত্র ওয়াই-ফাই সংযোগে। যদি ব্যবহারকারী ওয়াই-ফাই সংযোগে না থাকেন, তাহলে PlayAssetBundleRequest এর স্ট্যাটাস 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;
    }
}

অনুরোধ বাতিল করুন (শুধুমাত্র চাহিদা অনুযায়ী)

AssetBundle-গুলি মেমরিতে লোড হওয়ার আগে যদি অনুরোধটি বাতিল করার প্রয়োজন হয়, তাহলে PlayAssetBundleRequest অবজেক্টের AttemptCancel() মেথডটি কল করুন:

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

অ্যাসিঙ্ক্রোনাসভাবে অ্যাসেট প্যাকগুলির জন্য অনুরোধ করুন

বেশিরভাগ ক্ষেত্রে, অ্যাসিঙ্ক্রোনাসভাবে অ্যাসেট প্যাকের অনুরোধ জানাতে এবং অগ্রগতি নিরীক্ষণ করতে আপনার কোরাউটিন ব্যবহার করা উচিত, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:

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;

ত্রুটি পরিচালনা সম্পর্কে আরও তথ্যের জন্য, AssetDeliveryErrorCodes এর তালিকাটি দেখুন।

অন্যান্য প্লে কোর এপিআই পদ্ধতি

নিম্নলিখিতগুলি হল কিছু অতিরিক্ত API পদ্ধতি যা আপনি আপনার অ্যাপে ব্যবহার করতে চাইতে পারেন।

ডাউনলোড সাইজ চেক করুন

Google Play-তে একটি অ্যাসিঙ্ক্রোনাস কল করে এবং অপারেশনটি সম্পন্ন হলে একটি কলব্যাক মেথড সেট করে একটি AssetBundle-এর সাইজ চেক করুন:

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

অ্যাসেটবান্ডেলগুলি সরান

আপনি ফাস্ট-ফলো এবং অন-ডিমান্ড অ্যাসেটবান্ডেলগুলি সরিয়ে ফেলতে পারেন যেগুলি বর্তমানে মেমরিতে লোড করা নেই। নিম্নলিখিত অ্যাসিঙ্ক্রোনাস কলটি করুন এবং এটি সম্পন্ন হলে একটি কলব্যাক পদ্ধতি সেট করুন:

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

পরবর্তী পদক্ষেপ

স্থানীয়ভাবে এবং গুগল প্লে থেকে অ্যাসেট ডেলিভারি পরীক্ষা করুন