পরীক্ষামূলক YouTube Playables Unity Wrapper

এই র‍্যাপারটির সাহায্যে আপনি ইউনিটি সি#-এ ইউটিউব প্লেয়েবলস এসডিকে অ্যাক্সেস করতে পারবেন। আপনার ডেভেলপমেন্টের গতি বাড়াতে র‍্যাপারটিতে একটি .jslib প্লাগ-ইন এবং একটি সি# ফাইল রয়েছে। এছাড়াও একটি স্যাম্পল প্রজেক্ট আছে, যা দেখায় কীভাবে আপনি আপনার প্রজেক্টে এগুলো ব্যবহার করতে পারেন।

ইউনিটি প্যাকেজগুলো আমাদের প্লেয়েবলস স্যাম্পল রিপো থেকে ডাউনলোড করা যাবে।

ব্যবহার

  1. আপনার ইউনিটি প্রোজেক্টের প্ল্যাটফর্ম WebGL এ সেট করা আছে কিনা তা যাচাই করুন। এই সেটিংটি Build Settings এ পাওয়া যায়।
  2. হয় আপনার গেমটি ওয়েবের জন্য বিল্ড করতে WebGLTemplate ব্যবহার করুন, অথবা 'Use your own index.html file' অংশটি অনুসরণ করুন এবং যাচাই করে নিন যে আপনি আপনার index.html ফাইলে ওয়েব SDK সেটআপ ও ইনিশিয়ালাইজ করেছেন।
    • WebGLTemplate Google-WebGLTemplate-only.unitypackage অথবা GoogleYTGameWrapper-with-sample.unitypackage প্যাকেজগুলোতে পাওয়া যাবে। এই টেমপ্লেটটি সেট ও ব্যবহার করার জন্য WebGL Template সেকশনের ধাপগুলো অনুসরণ করুন।
    • আপনার নিজের ওয়েব এবং index.html ফাইল ব্যবহার করতে হলে, আপনার index.html ইউনিটি ক্রিয়েশন স্ক্রিপ্টে দুটি লাইন যোগ করতে হবে; ইন্টিগ্রেশনের জন্য 'আপনার নিজের index.html ফাইল ব্যবহার করুন' অংশটি দেখুন।
  3. ইউনিটিতে আপনার প্রজেক্টটি খুলুন, তারপর যেকোনো একটি প্যাকেজ খুলে আপনার প্রজেক্টে ইম্পোর্ট করুন।
    • GoogleYTGameWrapper.unitypackage : এতে YouTube Playables SDK সংযোগ করার জন্য একটি JS প্লাগইন এবং এটিকে আপনার পণ্যের সাথে সংযোগ করতে সাহায্য করার জন্য একটি C# র‍্যাপার রয়েছে।
    • GoogleYTGameWrapper-with-sample.unitypackage : এতে GoogleYTGameWrapper প্যাকেজের ফাইলগুলোই রয়েছে এবং C#-এ YouTube Playables SDK কীভাবে ব্যবহার করতে হয়, তা দেখানোর জন্য একটি নমুনাও আছে।
  4. গুরুত্বপূর্ণ: আপনার মূল সিনে একটি নতুন গেমঅবজেক্ট তৈরি করুন এবং এর নাম দিন YTGameWrapper । এই গেমঅবজেক্টটি JS ব্রিজের সাথে যোগাযোগের জন্য ব্যবহৃত হয়।
  5. গুরুত্বপূর্ণ: ইম্পোর্ট করা YTGameWrapper.cs কোডটিকে YTGameWrapper গেমঅবজেক্টের একটি স্ক্রিপ্ট কম্পোনেন্ট হিসেবে যুক্ত করুন।
  6. আপনার প্রজেক্টে একাধিক সিন থাকলে, YTGameWrapper.cs স্ক্রিপ্টে DontDestroyOnLoad যোগ করতে ভুলবেন না (দ্রষ্টব্য: স্ক্রিপ্টটির নতুন সংস্করণগুলিতে DontDestroyOnSceneChange নামে একটি টগল রয়েছে যা ডিফল্টরূপে চালু থাকে)। এটি নিশ্চিত করবে যে স্ক্রিপ্ট এবং গেমঅবজেক্টটি আপনার গেম জুড়ে টিকে থাকবে।

    GameObject.DontDestroyOnLoad(this.gameObject);
    
  7. YTGameWrapper.cs কম্পোনেন্ট এবং YTGameWrapper গেমঅবজেক্টটি ইউটিউব প্লেয়েবলস এসডিকে (YouTube Playables SDK)-এর সাথে সংযোগ করার জন্য ব্যবহৃত হয়। ইউটিউবের সাথে সংযোগ করতে এগুলি ব্যবহার করুন। এর জন্য হয় স্ক্রিপ্ট ব্যবহার করে অবজেক্ট এবং কম্পোনেন্টটি খুঁজে বের করুন, অথবা ইউনিটি এডিটর (Unity Editor)-এর মাধ্যমে ম্যানুয়ালি আপনার গেম কোডে এগুলি যুক্ত করুন।

  8. আপনার প্রকল্পের জন্য প্রয়োজনীয় কারিগরি শর্তাবলী আপনি অনুসরণ করছেন কিনা, তা যাচাই করুন।

আপনার নিজের index.html ফাইল ব্যবহার করুন

আপনি যদি প্রদত্ত index.html উদাহরণটি ব্যবহার না করেন, তাহলে আপনার index.html ক্রিয়েশন স্ক্রিপ্টে দুই লাইন কোড যোগ করতে হবে।

প্রথমে, আপনার প্রজেক্ট যেখানে ইউনিটি কন্টেইনার, ক্যানভাস ইত্যাদির জন্য ভ্যারিয়েবল সেট করে, ঠিক সেই জায়গায় এই লাইনটি যোগ করুন।

    var container = document.querySelector("#unity-container");
    var canvas = document.querySelector("#unity-canvas");

    var unityGameInstance = null; // <-- Add this line >

    ...

দ্বিতীয়ত, createUnityInstance ফাংশনের ভিতরে এই লাইনটি যোগ করুন।

    createUnityInstance(canvas, config, (progress) => {
        progressBarFull.style.width = 100 * progress + "%";
    }).then((unityInstance) => {

        unityGameInstance = unityInstance; // <-- Add this line >

    ...

উদাহরণ

এই বিভাগে C# র‍্যাপারটি কীভাবে ব্যবহার করতে হয় তার কিছু উদাহরণ দেওয়া হয়েছে, এটি উপলব্ধ API-গুলির সম্পূর্ণ তালিকা নয়। উপলব্ধ API-গুলির সম্পূর্ণ তালিকার জন্য, YouTube Playables SDK দেখুন।

sendScore

এই উদাহরণে C#-এ sendScore(int points) এর একটি বাস্তবায়ন দেখানো হয়েছে:

...
using YTGameSDK;
...

public YTGameWrapper ytGameWrapper;
public int battleScore = 0;

...

// Update the total score and send this to the YouTube Game Wrapper.
public void UpdateScores(int scoreAmt)
{
    battleScore += scoreAmt;
    // ytGameWrapper should be a reference to your YTGameWrapper component.
    ytGameWrapper.SendGameScore(battleScore);
}

onPause

এটি একটি উদাহরণ যেখানে একটি গেম, প্রয়োজনে তার ইঞ্জিনকে থামানোর জন্য, YT Playables থেকে আসা Pause ইভেন্টগুলো শুনতে পারে:

...
using YTGameSDK;
...

public YTGameWrapper ytGameWrapper;
public bool gameIsPaused = false;

...
void Start()
{
    // Sets the OnPause callback with the YT Playables SDK
    ytGameWrapper.SetOnPauseCallback(PauseTheGameCallback);
}

// Pause game callback, will pause the game when called.
public void PauseTheGameCallback()
{
    gameIsPaused = true;
}

saveData

এটি হলো saveData ব্যবহার করে YT Playables SDK-তে ডেটা পাঠানোর একটি উদাহরণ:

...
using YTGameSDK;
...

public YTGameWrapper ytGameWrapper;

...

// Saves the current score of the game and converts it to a JSON format.
public void SaveScore(int scoreAmt)
{
    SaveGameData("{\"BestScore\": \"" + scoreAmt.ToString() + "\"}");
}

public void SaveGameData(string saveString)
{
    if (string.IsNullOrEmpty(saveString)) return;

    // Sends save data to the YT Playables SDK
    ytGameWrapper.SendGameSaveData(saveString);
}

loadData

YT Playables SDK-তে loadData ব্যবহার করে ডেটা পাঠানোর একটি উদাহরণ নিচে দেওয়া হলো:

...
using UnityEngine;
using YTGameSDK;
...

[Serializable]
public class LoadedScores
{
    public int BestScore;
    public float BestTime;
}

public YTGameWrapper ytGameWrapper;

...

void Start()
{
    ytGameWrapper.LoadGameSaveData(LoadSaveGameDataReturned);
}

public void LoadSaveGameDataReturned(string data)
{
    if (!string.IsNullOrEmpty(data))
    {
        LoadedScores loadedScores = JsonUtility.FromJson<LoadedScores>(data);
        Debug.Log("LoadSaveGameDataReturned > Score <" + loadedScores.BestScore.ToString()
                  +   "> Time <" + loadedScores.BestTime.ToString("0.00"));
    }
}

requestInterstitialAd

এটি requestInterstitialAd ব্যবহারের একটি উদাহরণ, যা নির্দেশ করে যে একটি ইন্টারস্টিশিয়াল বিজ্ঞাপন (যদি উপলব্ধ থাকে) দেখানোর জন্য এটি একটি উপযুক্ত সময়। সর্বোত্তম ফলাফলের জন্য, গেমপ্লে চলাকালীন বিরতির সময়, যেমন একটি লেভেলের শেষে, এই কলটি করুন।

...
using YTGameSDK;
...

public YTGameWrapper ytGameWrapper;

...

// At the end of a round send a request to show an interstitial Ad, if one is
//  available an Ad will be shown and Pause Game Callback should be called.

// EXAMPLE: send and forget
public void RequestInterstitialAd()
{
    ytGameWrapper.RequestInterstitialAd();
}

// EXAMPLE: send and react to if an Ad was shown
public void RequestInterstitialAd()
{
    int status = ytGameWrapper.RequestInterstitialAd();
    if (status == 0)
    {
        // Ad request was successful, do some action.
    }
}

requestRewardedAd

এটি requestRewardedAd ব্যবহারের একটি উদাহরণ। এটি তখন ব্যবহৃত হয় যখন কোনো ব্যবহারকারী আপনার গেমে কোনো পুরস্কারের বিনিময়ে একটি পুরস্কারযুক্ত বিজ্ঞাপন দেখার জন্য নির্বাচন করেন। যদি কোনো বিজ্ঞাপন উপলব্ধ থাকে, তবে ব্যবহারকারীকে একটি দেখানো হবে।

...
using YTGameSDK;
...

public YTGameWrapper ytGameWrapper;

...

public void RequestRewardedAd()
{
    // Register callback for Rewarded Ads. If an Ad is available one will be
    //  shown. Pause Game Callback should be called. Any ID is fine as long as
    //  its identifyable for your game.
    ytGameWrapper.RequestRewardedAd("my-reward-ad-id-123", (rewardEarned) => {
        if (rewardEarned) {
            // Rewarded Ad is earned, reward the user.
        } else {
            // Rewarded Ad not earned, take the appropriate action
        }
    });
}

ইউটিউবের উদাহরণ WebGL টেমপ্লেট কীভাবে ব্যবহার করবেন

Unless you have a very heavy Unity project your built .wasm and .data files should be under our individual file size limit. If this is the case no extra compression should be done on your end for these files as they will be automatically compressed on submission of your Playable files. This automatic compression will also verify that your .wasm file fits into the initial bundle size requirement. As an example, a ~25 MiB .wasm file will compress to ~7 MiB.

যদি কোনো কারণে আপনার ফাইলগুলির আকার সর্বোচ্চ স্বতন্ত্র ফাইলের আকারের সীমা অতিক্রম করে, তবে সেগুলি এই সীমার মধ্যে আছে কিনা তা যাচাই করার জন্য ZIP কম্প্রেশন ব্যবহার করাই শ্রেয়। প্লেয়েবল কম্প্রেশন এই ফাইলগুলিকে পুনরায় কম্প্রেস করবে না।

WebGL টেমপ্লেট

  1. প্রাথমিক সেটআপের জন্য উপরে দেওয়া ইউনিটি প্যাকেজের নির্দেশাবলী অনুসরণ করুন। নিশ্চিত করুন যে আপনি Google-WebGLTemplate-only.unitypackage অথবা GoogleYTGameWrapper-with-sample.unitypackage ব্যবহার করছেন এবং WebGLTemplates/YTGameWrapperTemplate/ ফোল্ডারের অধীনে থাকা সমস্ত ফাইল ইম্পোর্ট করছেন।
    • দ্রষ্টব্য: আপনি যদি আগে থেকে YTGameWrapper.cs এবং UnityYTGameSDKLib.jslib ইম্পোর্ট না করে থাকেন, তাহলে সেগুলোও ইম্পোর্ট করে নিন।
  2. আপনার WebGL টেমপ্লেটটি YTGameWrapperTemplate ব্যবহার করার জন্য সেট করুন। এই সেটিংটি Edit -> Project settings -> Player -> WebGL ট্যাব -> Resolution and Presentation বিভাগে রয়েছে।
    • দ্রষ্টব্য: টেমপ্লেটে ডিফল্ট ক্যানভাসের প্রস্থ এবং উচ্চতা ১০০% সেট করা আছে, তাই এই ইউনিটি সেটিংস কোনো পরিবর্তন করবে না।
  3. আপনার Compression Format 'Disabled' করা আছে কিনা তা নিশ্চিত করুন। এই সেটিংটি Project settings -> Player -> WebGL ট্যাব -> Publishing Settings বিভাগে রয়েছে।
  4. Build Settings উইন্ডোতে WebGL এর জন্য বিল্ড করুন, তারপর আপনার প্রোজেক্টের প্রয়োজন অনুযায়ী ধাপ ৭ বা ৫-এ যান।
  5. Only follow steps 5 & 6 if compression is used : After your project is built navigate to your build folder location and open the Build folder. Find your projects .wasm or .data files that need compression to fit into the individual file size limits and zip these files. Make sure to delete the original .wasm / .data files that were compressed as you will be submitting the *.wasm.zip and *.data.zip files instead.
    • দ্রষ্টব্য: আপনি যদি ম্যাক ব্যবহার করেন, তাহলে ফাইলটিতে রাইট-ক্লিক করে "Compress *" নির্বাচন করতে পারেন। পিসিতে আপনি ফাইলটিতে রাইট-ক্লিক করে "Compress to ZIP file" নির্বাচন করতে পারেন।
  6. শুধুমাত্র তখনই অনুসরণ করুন যদি আপনি ধাপ ৫ সম্পন্ন করে থাকেন : জিপ করা ফাইল লোড করতে এবং সেগুলোকে ডিকম্প্রেস করতে YTGameWrapperTemplate থেকে তৈরি index.html ফাইলটি আপডেট করুন।
    • index.html ফাইলগুলোর শেষের দিকে আপনি Path 1 খুঁজে পাবেন এবং InitUnitySection(); এই লাইনটি কমেন্ট আউট করে দিন।
    • index.html ফাইলগুলোর শেষের দিকে আপনি Path 2 খুঁজে পাবেন এবং loadResources(InitUnitySection); এই লাইনটি কমেন্ট আউট করুন।
  7. সার্টিফিকেশনের জন্য আপনার প্রজেক্ট জমা দেওয়ার সময়, আপনাকে ইউনিটি থেকে বিল্ড করা সমস্ত ফাইল ধাপ ৪-এর বিল্ড লোকেশনে পাঠাতে হবে। যদি ধাপ ৫ ও ৬ অনুসরণ করা হয়ে থাকে, তাহলে এই ফাইলগুলোও অন্তর্ভুক্ত করুন।

ইউনিভার্সাল রেন্ডার পাইপলাইন (URP) ব্যবহার করার জন্য প্রদত্ত নমুনাগুলো আপগ্রেড করুন।

ইউনিটির নতুন সংস্করণগুলোর অন্যতম একটি সাম্প্রতিক অগ্রগতি হলো ইউনিভার্সাল রেন্ডার পাইপলাইন (URP) ব্যবহার করা। স্যাম্পলটিকে আপগ্রেড করার জন্য, যাতে সবকিছু সঠিকভাবে রেন্ডার হয়।

  1. প্রথমে একটি নতুন বা বিদ্যমান প্রজেক্টে GoogleYTGameWrapper-with-sample.unitypackage প্যাকেজটি ইম্পোর্ট করুন।
  2. Render Pipeline Converter উইন্ডোতে যান: Window -> Rendering -> Render Pipeline Converter
  3. Rendering Settings , Material Upgrade এবং Readonly Material Converter নির্বাচন করুন।
  4. এরপর Initialize and Convert নির্বাচন করুন, এটি শেষ হওয়া পর্যন্ত অপেক্ষা করুন এবং নমুনাটি URP-এর জন্য প্রস্তুত হয়ে যাবে।

আপনার ইউনিটি প্রোজেক্টে অ্যাসেটগুলো কীভাবে ভাগ করবেন (লেজি লোডিং)

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

অ্যাসেট লেজি লোডিং আপনার প্রোজেক্টের জন্য একটি দারুণ অপটিমাইজেশন, কারণ এর মাধ্যমে আপনি প্রয়োজন অনুযায়ী অ্যাসেট, লেভেল এবং ডেটা লোড করতে পারেন। যদি এটি সঠিকভাবে করা হয়, তবে আমাদের সার্টিফিকেশন টিম ফাইলের সামগ্রিক আকারের সীমাবদ্ধতা শিথিল করতে পারে, কারণ এতে আপনার সম্পূর্ণ গেমটি একবারে লোড না হয়ে, ব্যবহারকারী যখন আপনার প্রোডাক্টটি ব্যবহার করবে, তখন লোড হবে।

সঠিকভাবে লোড হতে সাহায্য করার জন্য, ইউনিটিতে আপনার অ্যাসেটগুলোকে ভাগ করার বেশ কিছু উপায় রয়েছে। এর মাধ্যমে নিশ্চিত করা যায় যে আপনার প্রতিটি অ্যাসেট গ্রুপ আকারের সীমার মধ্যে আছে এবং আপনি সময়ের সাথে সাথে কন্টেন্ট লোড করছেন। আমরা অ্যাড্রেসেবলস (Addressables) অথবা অ্যাসেট বান্ডেলস (Asset Bundles) ব্যবহার করার পরামর্শ দিই।

ঠিকানাযোগ্য

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

Addressables ব্যবহার করার জন্য আপনাকে Unity-র প্যাকেজ ম্যানেজারের মাধ্যমে Addressables প্যাকেজটি ইম্পোর্ট করতে হবে এবং তারপর আপনার অ্যাসেটগুলোকে Addressable Group-এ ট্যাগ করতে হবে। এ বিষয়ে আরও বিস্তারিত তথ্য Unity ডকুমেন্টেশনে পাওয়া যাবে।

সম্পদ বান্ডিল

Asset Bundles are helpful as you can split up your project and load elements on the fly. These are helpful for DLC, levels packs, new characters, and more. Asset Bundles are great for self managed content loading and bundling. These can be used by tagging your assets into specific bundles, then loading bundles as you need them. More details can be found in Unity's Asset Bundle documentation .

সম্পূর্ণ YT প্লেয়েবলস এপিআই রেফারেন্সটি দেখুন।