প্লে গেম পরিষেবা v2 (ইউনিটি) এ মাইগ্রেট করুন

এই ডকুমেন্টটিতে বর্ণনা করা হয়েছে কীভাবে বিদ্যমান গেমগুলোকে গেমস v1 SDK থেকে গেমস v2 SDK- তে মাইগ্রেট করতে হয়। ইউনিটির প্লে গেমস প্লাগইন, ভার্সন ১০ এবং তার পূর্ববর্তী সংস্করণগুলো, গেমস v1 SDK ব্যবহার করে।

শুরু করার আগে

  • নিশ্চিত করুন যে আপনি ইতিমধ্যেই প্লে কনসোল সেট আপ করেছেন এবং ইউনিটি এডিটর ইনস্টল করেছেন।

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

প্লে গেমস সার্ভিসের সর্বশেষ ফিচারগুলোর সুবিধা পেতে, প্লাগইনের সর্বশেষ সংস্করণটি ডাউনলোড ও ইনস্টল করুন। এটি গিটহাব রিপোজিটরি থেকে ডাউনলোড করুন।

পুরানো প্লাগইনটি সরান

ইউনিটি এডিটর থেকে নিম্নলিখিত ফোল্ডার বা ফাইলগুলো মুছে ফেলুন।

Assets/GooglePlayGames

Assets/GeneratedLocalRepo/GooglePlayGames

Assets/Plugins/Android/GooglePlayGamesManifest.androidlib

Assets/Plugins/Android
আপনার ইউনিটি প্রজেক্ট থেকে হাইলাইট করা ফোল্ডারগুলো মুছে ফেলুন।
আপনার ইউনিটি প্রজেক্ট থেকে হাইলাইট করা ফোল্ডারগুলো সরিয়ে ফেলুন (বড় করে দেখতে ক্লিক করুন)।

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

আপনার ইউনিটি প্রজেক্টে প্লাগইনটি ইম্পোর্ট করতে, এই ধাপগুলো অনুসরণ করুন:

  1. আপনার গেম প্রজেক্টটি খুলুন।
  2. ইউনিটি এডিটরে, ডাউনলোড করা unitypackage ফাইলটি আপনার প্রোজেক্টের অ্যাসেটসে ইম্পোর্ট করতে Assets > Import Package > Custom Package-এ ক্লিক করুন।
  3. নিশ্চিত করুন যে আপনার বর্তমান বিল্ড প্ল্যাটফর্মটি অ্যান্ড্রয়েড- এ সেট করা আছে।

    1. প্রধান মেনুতে, ফাইল > বিল্ড সেটিংস-এ ক্লিক করুন।

    2. অ্যান্ড্রয়েড নির্বাচন করুন এবং প্ল্যাটফর্ম পরিবর্তন করুন-এ ক্লিক করুন।

    3. Window > Google Play Games-এর অধীনে একটি নতুন মেনু আইটেম থাকার কথা। যদি না থাকে, তাহলে Assets > Refresh- এ ক্লিক করে অ্যাসেটগুলো রিফ্রেশ করুন এবং তারপর আবার বিল্ড প্ল্যাটফর্ম সেট করার চেষ্টা করুন।

  4. ইউনিটি এডিটরে, ফাইল > বিল্ড সেটিংস > প্লেয়ার সেটিংস > অন্যান্য সেটিংস- এ ক্লিক করুন।

  5. টার্গেট এপিআই লেভেল বক্সে একটি ভার্সন নির্বাচন করুন।

  6. স্ক্রিপ্টিং ব্যাকএন্ড বক্সে IL2CPP লিখুন।

  7. টার্গেট আর্কিটেকচার বক্সে একটি মান নির্বাচন করুন।

  8. প্যাকেজের নাম package_name লিখে রাখুন। আপনি এই তথ্যটি পরবর্তীতে ব্যবহার করতে পারবেন।

    আপনার ইউনিটি প্রোজেক্টের প্লেয়ার সেটিংস
    আপনার ইউনিটি প্রোজেক্টের প্লেয়ার সেটিংস।
  9. প্লে কনসোল থেকে অ্যান্ড্রয়েড রিসোর্সগুলো কপি করুন

  10. আপনার ইউনিটি প্রজেক্টে অ্যান্ড্রয়েড রিসোর্সগুলো যোগ করুন

অভিবাসনের পথ

আপনার গেমের জন্য সঠিক মাইগ্রেশন পথ নির্ভর করে এটি কীভাবে প্লে গেমস সার্ভিসেস ভি১ (Play Games Services v1) প্রয়োগ করে এবং প্লেয়ারের পরিচয় পরিচালনা করে তার উপর। একটি মসৃণ রূপান্তর নিশ্চিত করতে এবং প্লেয়ারের ডেটা হারানো রোধ করতে, আপনার বর্তমান সেটআপের সাথে সবচেয়ে ভালোভাবে মেলে এমন পরিস্থিতিটি চিহ্নিত করুন এবং সংশ্লিষ্ট পদক্ষেপগুলি অনুসরণ করুন।

বিকল্প ১: যেসব গেমের ক্ষেত্রে IGA, Play Games Services Player ID-এর সাথে সংযুক্ত থাকে

এই পরিস্থিতিটি সেইসব গেমের ক্ষেত্রে প্রযোজ্য, যেগুলি কোনো প্লেয়ারের ইন-গেম অ্যাকাউন্টের (IGA) একমাত্র শনাক্তকারী হিসেবে প্লে গেমস সার্ভিসেস Player ID ব্যবহার করেছে এবং পূর্বে কোনো OpenID জন্য অনুরোধ বা তা সংরক্ষণ করেনি। মূল চ্যালেঞ্জটি হলো প্লেয়ারের অগ্রগতির সাথে সংযোগ না হারিয়ে বিদ্যমান IGA-কে একটি প্রাথমিক শনাক্তকারীর ( OpenID ) সাথে সংযুক্ত করা।

স্থানান্তর প্রক্রিয়ায় নিম্নলিখিত ধাপগুলো অন্তর্ভুক্ত রয়েছে:

  1. গেমটি চালু হলে, প্লে গেমস সার্ভিসেস ভি২ এসডিকে স্বয়ংক্রিয়ভাবে এবং নীরবে প্ল্যাটফর্মটিকে প্রমাণীকরণ করে।
  2. গেমটি তার লগইন স্ক্রিন প্রদর্শন করে। এই স্ক্রিনে গুগল প্লে বাটনটির পরিবর্তে একটি ‘সাইন ইন উইথ গুগল ’ (SiWG) বাটন থাকতে হবে। সংহত করতে:

    1. CredManBridge.java ফাইলটি আপনার ফোল্ডারে ডাউনলোড করুন। এই জাভা ক্লাসটি ইউনিটি এবং androidx.credentials লাইব্রেরির মধ্যে একটি সেতু হিসেবে কাজ করে।

      CredManBridge.java
      
      package com.wickedcube.trivialkart;
      import android.accounts.Account;
      import android.content.Context;
      import android.util.Log;
      import android.os.CancellationSignal;
      import androidx.credentials.CredentialManager;
      import androidx.credentials.GetCredentialRequest;
      import androidx.credentials.GetCredentialResponse;
      import androidx.credentials.exceptions.GetCredentialException;
      import androidx.credentials.exceptions.NoCredentialException;
      import com.google.android.libraries.identity.googleid.GetGoogleIdOption;
      import com.google.android.libraries.identity.googleid.GoogleIdTokenCredential;
      import com.google.android.gms.auth.api.identity.AuthorizationClient;
      import com.google.android.gms.auth.api.identity.AuthorizationRequest;
      import com.google.android.gms.auth.api.identity.AuthorizationResult;
      import com.google.android.gms.common.api.ApiException;
      import com.google.android.gms.auth.api.identity.Identity;
      import com.google.android.gms.common.api.Scope;
      import com.unity3d.player.UnityPlayer;
      import java.util.Collections;
      import java.util.List;
      import java.util.concurrent.Executor;
      import java.util.concurrent.Executors;

      public class CredManBridge {

      // --- MODE 1: SILENT SIGN-IN (Called on Awake) --- // Tries to auto-select an authorized account. If it fails, it does NOT show UI. public static void signInSilent(Context context, String webClientId) { CredentialManager credentialManager = CredentialManager.create(context); CancellationSignal cancellationSignal = new CancellationSignal(); Executor executor = Executors.newSingleThreadExecutor();

      Log.d("CredMan", "Attempting Silent Sign-In...");

      GetGoogleIdOption silentOption = new GetGoogleIdOption.Builder() .setFilterByAuthorizedAccounts(true) // Strict: Only authorized accounts .setServerClientId(webClientId) .setAutoSelectEnabled(true) // Auto-select if possible .build();

      GetCredentialRequest silentRequest = new GetCredentialRequest.Builder() .addCredentialOption(silentOption) .build();

      credentialManager.getCredentialAsync( context, silentRequest, cancellationSignal, executor, new androidx.credentials.CredentialManagerCallback<GetCredentialResponse, GetCredentialException>() { @Override public void onResult(GetCredentialResponse result) { Log.d("CredMan", "Silent Sign-In Successful!"); handleSignInResult(context, result, webClientId); }

          @Override
          public void onError(GetCredentialException e) {
              // Send a specific error code so Unity knows to just stay on the Start Screen
              Log.d("CredMan", "Silent sign-in failed. Keeping UI hidden.");
              UnityPlayer.UnitySendMessage("AuthManager", "OnSignInError", "SilentFailed");
          }
      }
      

      ); }

      // --- মোড ২: ইন্টারঅ্যাক্টিভ সাইন-ইন (বাটন ক্লিকে কল করা হয়) --- // অ্যাকাউন্ট নির্বাচন / "অ্যাকাউন্ট যোগ করুন" শীটটি দেখাতে বাধ্য করে। public static void signInInteractive(Context context, String webClientId) { CredentialManager credentialManager = CredentialManager.create(context); CancellationSignal cancellationSignal = new CancellationSignal(); Executor executor = Executors.newSingleThreadExecutor();

      Log.d("CredMan", "ইন্টারেক্টিভ সাইন-ইন শুরু হচ্ছে...");

      GetGoogleIdOption interactiveOption = new GetGoogleIdOption.Builder() .setFilterByAuthorizedAccounts(false) // সমস্ত অ্যাকাউন্ট দেখান (এবং "অ্যাকাউন্ট যোগ করুন") .setServerClientId(webClientId) .setAutoSelectEnabled(false) // UI দেখাতে বাধ্য করুন .build();

      GetCredentialRequest interactiveRequest = new GetCredentialRequest.Builder() .addCredentialOption(interactiveOption) .build();

      credentialManager.getCredentialAsync( context, interactiveRequest, cancellationSignal, executor, new androidx.credentials.CredentialManagerCallback () { @Override public void onResult(GetCredentialResponse result) { Log.d("CredMan", "ইন্টারেক্টিভ সাইন-ইন সফল!"); handleSignInResult(context, result, webClientId); }

          @Override
          public void onError(GetCredentialException e) {
              Log.e("CredMan", "Interactive Sign-In Canceled or Failed", e);
              UnityPlayer.UnitySendMessage("AuthManager", "OnSignInError", "Canceled");
          }
      }
      

      ); }

      private static void handleSignInResult(Context context, GetCredentialResponse result, String webClientId) { try { GoogleIdTokenCredential credential = GoogleIdTokenCredential.createFrom(result.getCredential().getData()); String email = credential.getId();

      Account account = new Account(email, "com.google");
      // Requesting GAMES_LITE scope to check for pre-existing V1 grants
      List<Scope> requestedScopes = Collections.singletonList(new Scope("https://www.googleapis.com/auth/games_lite"));
      
      AuthorizationRequest authRequest = new AuthorizationRequest.Builder()
          .setRequestedScopes(requestedScopes)
          .setAccount(account)
          .requestOfflineAccess(webClientId)
          .build();
      
      AuthorizationClient authClient = Identity.getAuthorizationClient(context);
      
      authClient.authorize(authRequest)
          .addOnSuccessListener(authorizationResult -> {
              if (authorizationResult.getServerAuthCode() != null) {
                  // CASE 1: RETURNING USER (Success)
                  // The user has already granted GAMES_LITE in the past.
                  // We got the code directly without showing UI.
                  Log.i("CredMan", "PGS v1: Existing grant found. Returning user detected. Auth Code retrieved.");
                  UnityPlayer.UnitySendMessage("AuthManager", "OnSignInSuccess", authorizationResult.getServerAuthCode());
              }
              else if (authorizationResult.hasResolution()) {
                  // CASE 2: NEW USER (PendingIntent)
                  // The user has NOT granted GAMES_LITE before. The API returned a PendingIntent
                  // (authorizationResult.getPendingIntent()) to show the consent screen.
                  // As per your flow, we DISCARD this intent and do not show UI.
                  Log.i("CredMan", "PGS v1: No existing grant (PendingIntent returned). This is a NEW user or they revoked access.");
                  Log.i("CredMan", "PGS v1: Discarding PendingIntent. Proceeding as New User.");
      
                  // Notify Unity that this is a "New User" so it can trigger V2 logic instead of failing
                  UnityPlayer.UnitySendMessage("AuthManager", "OnSignInError", "NewUser_NoGrant");
              }
              else {
                  // Edge Case: No code and no resolution?
                  Log.e("CredMan", "PGS v1: Authorization success but no Auth Code or Resolution returned.");
                  UnityPlayer.UnitySendMessage("AuthManager", "OnSignInError", "No Auth Code returned");
              }
          })
          .addOnFailureListener(e -> {
              // CASE 3: GENERIC FAILURE
              Log.e("CredMan", "PGS v1: Authorization failed completely.", e);
              UnityPlayer.UnitySendMessage("AuthManager", "OnSignInError", "Authorization Failed: " + e.getMessage());
          });
      

      } catch (Exception e) { UnityPlayer.UnitySendMessage("AuthManager", "OnSignInError", "পার্সিং ত্রুটি: " + e.getMessage()); } } }

    2. ক্রেডেনশিয়াল ম্যানেজার ইন্টিগ্রেশন:

      • সাইলেন্ট সাইন-ইন-এর জন্য, শুধুমাত্র সেইসব ব্যবহারকারীদের সাইন ইন করাতে GetGoogleIdOption সাথে setFilterByAuthorizedAccounts(true) ব্যবহার করুন, যারা আগে থেকে অ্যাপটিকে অনুমোদন দিয়েছেন।
      • ইন্টারেক্টিভ সাইন-ইন-এর জন্য setFilterByAuthorizedAccounts(false) ব্যবহার করুন, যাতে ব্যবহারকারীরা একটি অ্যাকাউন্ট নির্বাচন করতে বা নতুন একটি যোগ করতে পারেন।
    3. পরিধি অনুরোধ:

      • মূল গুগল ক্রেডেনশিয়ালটি পাওয়ার পর, এটি একটি AuthorizationRequest তৈরি করে, যার মাধ্যমে নির্দিষ্ট লিগ্যাসি স্কোপ: https://www.googleapis.com/auth/games_lite- এর জন্য অনুরোধ করা হয়।
      • এই স্কোপটি অত্যন্ত গুরুত্বপূর্ণ, কারণ এটি সার্ভারকে ব্যবহারকারীর লিগ্যাসি প্লেয়ারআইডি খুঁজে বের করার অনুমতি দেয়।
    4. ফলাফল ব্যবস্থাপনা:

      • যদি ব্যবহারকারী অনুমতি দেন (বা পূর্বে দিয়ে থাকেন), তাহলে ব্রিজটি ServerAuthCode টি ইউনিটিতে ফেরত পাঠায়।
      • যদি ব্যবহারকারী অনুমতি না দিয়ে থাকেন (নতুন ব্যবহারকারীর ক্ষেত্রে), তাহলে এপিআই একটি PendingIntent রিটার্ন করে। এই স্যাম্পলে, কার্যপ্রবাহ সহজ করার জন্য ইনটেন্টটি বাতিল করা হয়েছে এবং ব্যবহারকারীকে একজন নতুন ব্যবহারকারী হিসেবে গণ্য করা হয়েছে।
  3. ক্রেডেনশিয়াল ম্যানেজার এবং গুগল আইডেন্টিটি পরিষেবাগুলোকে সমর্থন করার জন্য, আপনার mainTemplate.gradle গ্রেডল কনফিগারেশনে নিম্নলিখিত ডিপেন্ডেন্সিগুলো যোগ করা নিশ্চিত করুন।

    dependencies {
    // Standard Unity dependencies
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    
    // Credential Manager and Identity Libraries
    implementation 'androidx.credentials:credentials:1.3.0'
    implementation 'androidx.credentials:credentials-play-services-auth:1.3.0'
    implementation 'com.google.android.libraries.identity.googleid:googleid:1.1.1'
    
    // Play Services Auth for legacy scope handling
    implementation 'com.google.android.gms:play-services-auth:21.2.0'
    }
    • ক্রেডেনশিয়াল ম্যানেজার: মূল আইডেন্টিটি অর্কেস্ট্রেশন এবং অ্যাকাউন্ট নির্বাচনের জন্য ইউআই পরিচালনা করে।
    • GoogleID লাইব্রেরি: বিশেষভাবে OpenID Connect টোকেন পুনরুদ্ধার করার জন্য GetGoogleIdOption প্রদান করে।
    • প্লে সার্ভিসেস অথেন্টিকেশন: সামঞ্জস্যতা বজায় রাখতে এবং পুরোনো Player ID পুনরুদ্ধারের জন্য GAMES_LITE স্কোপের অনুরোধ করতে এটি প্রয়োজন।
  4. যখন প্লেয়ার SiWG বাটনটি ট্যাপ করে একটি গুগল অ্যাকাউন্ট নির্বাচন করে, তখন গেমটিকে অবশ্যই দুটি স্বতন্ত্র শনাক্তকারী সংগ্রহ করতে হবে:

    • OpenID , যা আইজিএ বাইন্ডিংয়ের জন্য প্রাথমিক শনাক্তকারী।
    • আপনার ব্যাকএন্ড সিস্টেমে প্লেয়ারের IGA খুঁজে বের করতে এবং বাইন্ডিং সম্পাদন করতে, GAMES_LITE স্কোপ ব্যবহার করে প্রাপ্ত প্লে গেমস সার্ভিসেস Player ID ব্যবহার করা হয়।
  5. পরবর্তী গেম লঞ্চগুলিতে, গেমগুলিকে প্রাথমিক শনাক্তকারী হিসাবে Player ID ব্যবহার করার প্রয়োজন ছাড়াই, খেলোয়াড়রা SiWG ফ্লো-এর মাধ্যমে তাদের IGA অ্যাক্সেস করতে পারবে।

আপনি একটি গেম ক্লায়েন্ট-সাইড বাস্তবায়ন ব্যবহার করে ধাপ ৪ সম্পাদন করতে পারেন।

  1. ডেভেলপার গুগল অ্যাকাউন্ট দিয়ে ব্যবহারকারীকে সাইন ইন করানোর জন্য অ্যান্ড্রয়েড ক্রেডেনশিয়াল ম্যানেজার এপিআই কল করেন।
  2. ব্যবহারকারী SiwG সম্পন্ন করে একটি গুগল অ্যাকাউন্ট নির্বাচন করার পর, ডেভেলপার একটি রেজাল্ট অবজেক্ট পান, যাতে আইডি টোকেন এবং ইমেল অ্যাড্রেস থাকে।
  3. ডেভেলপার ইমেইল ঠিকানা থেকে একটি অ্যাকাউন্ট অবজেক্ট তৈরি করেন।
  4. ডেভেলপার GAMES_LITE স্কোপ এবং অ্যাকাউন্ট ব্যবহার করে অথরাইজেশন এপিআই-কে কল করেন।
  5. যদি অ্যাকাউন্টটির GAMES_LITE স্কোপে আগে থেকেই কোনো অনুমোদন থাকে, তাহলে Authorization API সরাসরি রেসপন্স অবজেক্টে একটি টোকেন ফেরত দেয়।
    1. প্লে গেমস সার্ভিসেস সার্ভারগুলোকে কল করতে এবং প্লে গেমস সার্ভিসেস Player ID পুনরুদ্ধার করতে রেসপন্স টোকেনটি ব্যবহার করুন।
    2. ডেভেলপার যাচাই করে দেখে যে প্লে গেমস সার্ভিসেস Player ID কোনো ইন-গেম অ্যাকাউন্টের সাথে লিঙ্ক করা ছিল কি না।
      1. ডেভেলপার জানেন যে ইনি প্লে গেমস সার্ভিসেস ভি১ (Play Games Services v1) থেকে ফিরে আসা একজন ব্যবহারকারী।
    3. ডেভেলপার নতুন গাইয়া আইডিটি পূর্ববর্তী প্লে গেমস সার্ভিসেস ভি১ অ্যাকাউন্টের সাথে লিঙ্ক করতে পারবেন।
  6. অথবা, যদি অ্যাকাউন্টটির GAMES_LITE স্কোপে আগে থেকে কোনো অনুমোদন না থাকে, তাহলে Authorization API একটি PendingIntent রিটার্ন করে।
    1. ডেভেলপার জানেন যে ব্যবহারকারীর প্লে গেমস সার্ভিসেস ভি১-এ কোনো বিদ্যমান অ্যাকাউন্ট নেই।
    2. ডেভেলপার কোনো UI না দেখিয়েই নিরাপদে PendingIntent-টি বাতিল করতে পারেন।

বিকল্প ২: যে গেমগুলো ইতিমধ্যেই OpenID-এর সাথে IGA সংযুক্ত করে রেখেছে

এই গ্রুপের ডেভেলপারদের জন্য মাইগ্রেশনের পথটি সবচেয়ে সহজ। যদি আপনার গেমের ইন-গেম অ্যাকাউন্টটি ইতিমধ্যেই প্রাথমিকভাবে OpenID-এর সাথে সংযুক্ত থাকে, তাহলে আপনাকে কেবল ধাপগুলিতে বর্ণিত পদ্ধতি অনুযায়ী v1 থেকে v2-তে সাধারণ টেকনিক্যাল SDK মাইগ্রেশনটি সম্পন্ন করতে হবে।

স্বয়ংক্রিয় সাইন-ইন কোড আপডেট করুন

PlayGamesClientConfiguration ইনিশিয়ালাইজেশন ক্লাসটিকে PlayGamesPlatform.Instance.Authenticate() ক্লাস দিয়ে প্রতিস্থাপন করুন। PlayGamesPlatform এর ইনিশিয়ালাইজেশন এবং অ্যাক্টিভেশনের প্রয়োজন নেই। PlayGamesPlatform.Instance.Authenticate() কল করলে স্বয়ংক্রিয় সাইন-ইন-এর ফলাফল পাওয়া যায়। Play Games Services v2 ইন্টিগ্রেশনের সাথে প্রস্তাবিত অথেনটিকেশন ফ্লো সম্পর্কে আরও তথ্যের জন্য, "আদর্শ অথেনটিকেশন ফ্লো-এর জন্য ব্যবহারকারীর অভিজ্ঞতা নির্দেশিকা" দেখুন।

সি#

ইউনিটি এডিটরে, PlayGamesClientConfiguration ক্লাসযুক্ত ফাইলগুলো সনাক্ত করুন।

using GooglePlayGames;
using GooglePlayGames.BasicApi;
using UnityEngine.SocialPlatforms;

public void Start() {
    PlayGamesClientConfiguration config =
        new PlayGamesClientConfiguration.Builder()
    // Enables saving game progress
    .EnableSavedGames()
    // Requests the email address of the player be available
    // will bring up a prompt for consent
    .RequestEmail()
    // Requests a server auth code be generated so it can be passed to an
    // associated backend server application and exchanged for an OAuth token
    .RequestServerAuthCode(false)
    // Requests an ID token be generated. This OAuth token can be used to
    // identify the player to other services such as Firebase.
    .RequestIdToken()
    .Build();

    PlayGamesPlatform.InitializeInstance(config);
    // recommended for debugging:
    PlayGamesPlatform.DebugLogEnabled = true;
    // Activate the Google Play Games platform
    PlayGamesPlatform.Activate();
}

এবং এটিকে এভাবে আপডেট করুন:

using GooglePlayGames;

public void Start() {
    PlayGamesPlatform.Instance.Authenticate(ProcessAuthentication);
}

internal void ProcessAuthentication(SignInStatus status) {
    if (status == SignInStatus.Success) {
        // Continue with Play Games Services
    } else {
        // Disable your integration with Play Games Services or show a login
        // button to ask users to sign-in. Clicking it should call
        // PlayGamesPlatform.Instance.ManuallyAuthenticate(ProcessAuthentication).
    }
}

একটি সামাজিক প্ল্যাটফর্ম বেছে নিন

সোশ্যাল প্ল্যাটফর্ম বেছে নিতে, “সোশ্যাল প্ল্যাটফর্ম বেছে নিন” দেখুন।

সার্ভার প্রমাণীকরণ কোডগুলি পুনরুদ্ধার করুন

সার্ভার সাইড অ্যাক্সেস কোড পেতে, “সার্ভার প্রমাণীকরণ কোড পুনরুদ্ধার করুন” দেখুন।

সাইন-আউট কোড সরান

সাইন-আউটের কোডটি সরিয়ে ফেলা হয়েছে। প্লে গেমস সার্ভিসেস-এ এখন আর গেমের ভেতরে সাইন-আউট বাটনের প্রয়োজন নেই।

নিম্নলিখিত উদাহরণে দেখানো কোডটি সরিয়ে ফেলুন:

সি#

// sign out
PlayGamesPlatform.Instance.SignOut();

আপনার খেলা পরীক্ষা করুন

আপনার গেমটি ডিজাইন অনুযায়ী কাজ করছে কিনা তা পরীক্ষা করে নিশ্চিত করুন। আপনি কী ধরনের পরীক্ষা করবেন তা আপনার গেমের ফিচারগুলোর ওপর নির্ভর করে।

নিচে সাধারণত যে পরীক্ষাগুলো করা হয় তার একটি তালিকা দেওয়া হলো।

  1. সফলভাবে সাইন-ইন হয়েছে

    1. স্বয়ংক্রিয় সাইন-ইন কাজ করে। গেমটি চালু করার সময় ব্যবহারকারীকে প্লে গেমস সার্ভিসেস-এ সাইন ইন করা থাকতে হবে।

    2. স্বাগত পপআপটি প্রদর্শিত হয়।

      স্বাগত পপআপের নমুনা।
      স্বাগত পপআপের নমুনা (বড় করে দেখতে ক্লিক করুন)।

    3. সফলতার লগ বার্তাগুলো প্রদর্শিত হয়। টার্মিনালে নিম্নলিখিত কমান্ডটি চালান:

      adb logcat | grep com.google.android.

      নিম্নলিখিত উদাহরণে একটি সফল লগ বার্তা দেখানো হয়েছে:

      [$PlaylogGamesSignInAction$SignInPerformerSource@e1cdecc
      number=1 name=GAMES_SERVICE_BROKER>], returning true for shouldShowWelcomePopup.
      [CONTEXT service_id=1 ]
  2. UI উপাদানগুলোর সামঞ্জস্য নিশ্চিত করুন

    1. প্লে গেমস সার্ভিসেস ইউজার ইন্টারফেসে (UI) পপ-আপ, লিডারবোর্ড এবং অ্যাচিভমেন্টগুলো বিভিন্ন স্ক্রিনের আকার ও ওরিয়েন্টেশনে সঠিকভাবে এবং সামঞ্জস্যপূর্ণভাবে প্রদর্শিত হয়।

    2. প্লে গেমস সার্ভিসেস UI-তে সাইন-আউট অপশনটি দেখা যাচ্ছে না।

    3. নিশ্চিত করুন যে আপনি সফলভাবে প্লেয়ার আইডি পুনরুদ্ধার করতে পারছেন এবং প্রযোজ্য ক্ষেত্রে, সার্ভার-সাইডের কার্যক্রম প্রত্যাশিতভাবে কাজ করছে।

    4. যদি গেমটি সার্ভার-সাইড অথেন্টিকেশন ব্যবহার করে, তাহলে requestServerSideAccess ফ্লোটি পুঙ্খানুপুঙ্খভাবে পরীক্ষা করুন। নিশ্চিত করুন যে সার্ভারটি অথ কোডটি গ্রহণ করছে এবং সেটিকে একটি অ্যাক্সেস টোকেনের জন্য বিনিময় করতে পারছে। নেটওয়ার্ক ত্রুটি এবং অবৈধ client ID পরিস্থিতিগুলোর জন্য সফল এবং ব্যর্থ উভয় অবস্থাই পরীক্ষা করুন।

আপনার গেমে যদি নিম্নলিখিত বৈশিষ্ট্যগুলির কোনোটি ব্যবহৃত হয়ে থাকে, তবে মাইগ্রেশনের আগে যেমন কাজ করত, এখনও ঠিক তেমনই কাজ করছে কিনা তা নিশ্চিত করতে সেগুলি পরীক্ষা করুন:

  • লিডারবোর্ড : স্কোর জমা দিন এবং লিডারবোর্ড দেখুন। খেলোয়াড়দের নাম ও স্কোরের সঠিক র‍্যাঙ্কিং এবং প্রদর্শন যাচাই করুন।
  • কৃতিত্বসমূহ : কৃতিত্বগুলি আনলক করুন এবং যাচাই করুন যে সেগুলি প্লে গেমস UI-তে সঠিকভাবে নথিভুক্ত ও প্রদর্শিত হচ্ছে।
  • সংরক্ষিত গেম : যদি গেমটিতে সংরক্ষিত গেম ব্যবহারের সুবিধা থাকে, তবে নিশ্চিত করুন যে গেমের অগ্রগতি সংরক্ষণ এবং লোড করার প্রক্রিয়াটি ত্রুটিহীনভাবে কাজ করছে। একাধিক ডিভাইসে এবং অ্যাপ আপডেটের পরে এটি পরীক্ষা করা বিশেষভাবে গুরুত্বপূর্ণ।

মাইগ্রেশন পরবর্তী কাজ

গেমস ভি২ এসডিকে-তে স্থানান্তরিত হওয়ার পর নিম্নলিখিত ধাপগুলো সম্পূর্ণ করুন।

  1. প্লে অ্যাপ সাইনিং ব্যবহার করুন

  2. একটি AAB ফাইল তৈরি করুন

  3. একটি অভ্যন্তরীণ টেস্টিং রিলিজ তৈরি করুন

  4. আপনার অ্যাপ সাইনিং ক্রেডেনশিয়াল যাচাই করুন।