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

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

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

ব্যবহার

  1. আপনার ইউনিটি প্রজেক্ট প্ল্যাটফর্ম WebGL এ সেট করা আছে তা যাচাই করুন। এই সেটিংটি Build Settings পাওয়া যাবে।
  2. ওয়েবের জন্য আপনার গেম তৈরি করতে WebGLTemplate ব্যবহার করুন, অথবা আপনার নিজস্ব index.html ফাইল ব্যবহার করুন বিভাগটি অনুসরণ করুন এবং আপনি আপনার index.html ফাইলে ওয়েব SDK সেটআপ করেছেন এবং শুরু করেছেন তা যাচাই করুন৷
    • WebGLTemplate Google-WebGLTemplate-only.unitypackage বা GoogleYTGameWrapper-with-sample.unitypackage প্যাকেজে পাওয়া যাবে। এই টেমপ্লেট সেট আপ করতে এবং ব্যবহার করতে WebGL টেমপ্লেট বিভাগে ধাপগুলি অনুসরণ করুন৷
    • আপনার নিজস্ব ওয়েব এবং 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 GameObject-এ একটি স্ক্রিপ্ট উপাদান হিসাবে আমদানি করা YTGameWrapper.cs কোড যোগ করুন।
  6. আপনার প্রোজেক্টে একাধিক দৃশ্য থাকলে YTGameWrapper.cs স্ক্রিপ্টে DontDestroyOnLoad যোগ করা নিশ্চিত করুন (দ্রষ্টব্য: স্ক্রিপ্টের নতুন সংস্করণে একটি DontDestroyOnSceneChange টগল রয়েছে যা ডিফল্টরূপে চালু থাকে)। এটি নিশ্চিত করবে যে স্ক্রিপ্ট এবং গেমঅবজেক্ট আপনার গেম জুড়ে লেগে আছে।

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

  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

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

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

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

আপনার কাছে একটি খুব ভারী ইউনিটি প্রকল্প না থাকলে আপনার নির্মিত .wasm এবং .data ফাইলগুলি আমাদের পৃথক ফাইলের আকারের সীমার মধ্যে থাকা উচিত। যদি এটি হয় তবে এই ফাইলগুলির জন্য আপনার প্রান্তে কোনও অতিরিক্ত কম্প্রেশন করা উচিত নয় কারণ আপনার প্লেযোগ্য ফাইলগুলি জমা দেওয়ার সময় সেগুলি স্বয়ংক্রিয়ভাবে সংকুচিত হবে৷ এই স্বয়ংক্রিয় সংকোচন এছাড়াও যাচাই করবে যে আপনার .wasm ফাইলটি প্রাথমিক বান্ডেল আকারের প্রয়োজনীয়তার সাথে ফিট করে। উদাহরণ হিসেবে, একটি ~25 MiB .wasm ফাইল ~7 MiB তে সংকুচিত হবে।

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

ওয়েবজিএল টেমপ্লেট

  1. প্রাথমিক সেটআপের জন্য উপরের ইউনিটি প্যাকেজ নির্দেশাবলী অনুসরণ করুন। Google-WebGLTemplate-only.unitypackage বা GoogleYTGameWrapper-with-sample.unitypackage ব্যবহার করতে ভুলবেন না এবং WebGLTemplates/YTGameWrapperTemplate/ ফোল্ডারের অধীনে সমস্ত ফাইল আমদানি করুন৷
    • দ্রষ্টব্য: আপনি যদি ইতিমধ্যে YTGameWrapper.cs এবং UnityYTGameSDKLib.jslib আমদানি না করে থাকেন তবে আপনার সেগুলিও আমদানি করা উচিত।
  2. YTGameWrapperTemplate ব্যবহার করতে আপনার WebGL টেমপ্লেট সেট করুন। এই সেটিংটি Edit -> Project settings -> Player -> WebGL ট্যাব -> Resolution and Presentation বিভাগে রয়েছে৷
    • দ্রষ্টব্য: টেমপ্লেটে ডিফল্ট ক্যানভাসের প্রস্থ এবং উচ্চতা 100% সেট করা আছে তাই এই ইউনিটি সেটিংস কিছু সমন্বয় করবে না।
  3. নিশ্চিত করুন যে আপনার Compression Format নিষ্ক্রিয় সেট করা আছে. এই সেটিংটি Project settings -> Player -> WebGL ট্যাব -> Publishing Settings বিভাগে রয়েছে৷
  4. Build Settings উইন্ডোতে WebGL এর জন্য তৈরি করুন তারপর আপনার প্রকল্পের প্রয়োজনের উপর ভিত্তি করে ধাপ 7 বা 5-এ যান।
  5. কম্প্রেশন ব্যবহার করা হলে শুধুমাত্র পদক্ষেপ 5 এবং 6 অনুসরণ করুন : আপনার প্রকল্প তৈরি হওয়ার পরে আপনার বিল্ড ফোল্ডার অবস্থানে নেভিগেট করুন এবং Build ফোল্ডার খুলুন। আপনার প্রজেক্ট .wasm বা .data ফাইলগুলি খুঁজুন যেগুলি পৃথক ফাইলের আকারের সীমার মধ্যে ফিট করার জন্য কম্প্রেশন প্রয়োজন এবং এই ফাইলগুলি জিপ করুন৷ আপনি এর পরিবর্তে *.wasm.zip এবং *.data.zip ফাইলগুলি জমা দেবেন বলে কম্প্রেস করা আসল .wasm / .data ফাইলগুলি মুছে ফেলার বিষয়টি নিশ্চিত করুন৷
    • দ্রষ্টব্য: আপনি যদি ম্যাক ব্যবহার করেন তবে আপনি ফাইলটিতে ডান-ক্লিক করতে পারেন এবং "কম্প্রেস *" নির্বাচন করতে পারেন। পিসিতে আপনি ফাইলটিতে ডান-ক্লিক করতে পারেন এবং "কম্প্রেস টু জিপ ফাইল" নির্বাচন করতে পারেন।
  6. আপনি যদি পদক্ষেপ 5 করেন তবেই অনুসরণ করুন : জিপ করা ফাইলগুলি লোড করতে এবং তাদের ডিকম্প্রেস করতে YTGameWrapperTemplate থেকে তৈরি index.html ফাইলটি আপডেট করুন৷
    • index.html ফাইলগুলির শেষের কাছাকাছি আপনি Path 1 পাবেন এবং নিম্নলিখিত লাইনটি মন্তব্য করুন InitUnitySection(); .
    • index.html ফাইলগুলির শেষের দিকে আপনি Path 2 পাবেন এবং নিম্নলিখিত লাইন loadResources(InitUnitySection); .
  7. সার্টিফিকেশনের জন্য আপনার প্রকল্প জমা দেওয়ার সময় আপনাকে ইউনিটি থেকে নির্মিত সমস্ত ফাইল আপনার বিল্ড লোকেশনে ধাপ 4 থেকে পাঠাতে হবে। যদি ধাপ 5 + 6 অনুসরণ করা হয়, তাহলে এই ফাইলগুলিও অন্তর্ভুক্ত করুন।

ইউনিভার্সাল রেন্ডার পাইপলাইন (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 আপনাকে বিভিন্ন ফাইল সনাক্ত করতে দেয় যা একসাথে লোড করা উচিত এবং ইউনিটি আপনার জন্য বেশিরভাগ প্যাকেজিং পরিচালনা করবে। ইউনিটি ফাইলের আকারগুলি পরিচালনা করতে এবং আপনি সম্পদের নকল করছেন না তা নিশ্চিত করতে সহায়তা করার জন্য কিছু সরঞ্জাম সরবরাহ করে।

Addressables ব্যবহার করার জন্য আপনাকে প্যাকেজ ম্যানেজারের মাধ্যমে Addressables প্যাকেজ আমদানি করতে হবে এবং তারপর আপনার সম্পদকে Addressable গ্রুপে ট্যাগ করতে হবে। ইউনিটি ডকুমেন্টেশনের মাধ্যমে আরও বিশদ পাওয়া যাবে।

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

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

সম্পূর্ণ YT Playables API রেফারেন্স দেখুন।