বড় স্ক্রিনের সাইজ পরিবর্তন করার সুবিধা

ফোন থেকে বিভিন্ন বড় স্ক্রিন ফর্ম ফ্যাক্টরে প্রসারিত করার ফলে আপনার গেম কীভাবে উইন্ডো ম্যানেজমেন্ট হ্যান্ডেল করে তা বিবেচনা করতে হয়। Googlebook, ChromeOS এবং পিসি (PC)-তে Google Play Games-এ, আপনার গেম মূল ডেস্কটপ ইন্টারফেসের উপরে উইন্ডো মোডে চলতে পারে। নতুন Android ট্যাবলেট ও ফোল্ডেবল ডিভাইসে Android 12L (API লেভেল ৩২) বা তার পরবর্তী ভার্সন এবং স্ক্রিনের প্রস্থ > ৬০০ ডিপি থাকলে, আপনার গেম অন্যান্য অ্যাপ্লিকেশনের সাথে বিভক্ত-স্ক্রীন মোডে পাশাপাশি চলতে পারে, সাইজ পরিবর্তন করা যেতে পারে এবং এমনকি ফোল্ডেবল ডিভাইসে ইনার ও আউটার ডিসপ্লের মধ্যে সরানো যেতে পারে, যার ফলে উইন্ডোর সাইজ এবং কিছু ডিভাইসে ওরিয়েন্টেশনের জন্য কনফিগারেশন পরিবর্তন হয়।

Unity গেমের সাইজ পরিবর্তন করা

বেসিক বড় স্ক্রিন কনফিগারেশন

আপনার গেম রিসাইজ করা যাবে কিনা তা ঘোষণা করুন:

<android:resizeableActivity="true" or "false" />

রিসাইজ করার সুবিধা দিতে না পারলে, গেম ম্যানিফেস্টে স্পষ্টভাবে ন্যূনতম ও সর্বাধিক অ্যাস্পেক্ট রেশিও উল্লেখ করতে হবে:

<!-- Render full screen between 3:2 and 21:9 aspect ratio -->
<!-- Let the platform letterbox otherwise -->
<activity android:minAspectRatio="1.5">
<activity android:maxAspectRatio="2.33">

পিসি (PC)-তে Google Play Games

পিসি (PC)-তে Google Play Games-এর জন্য, প্ল্যাটফর্মটি নির্দিষ্ট অ্যাস্পেক্ট রেশিও বজায় রেখে উইন্ডোর সাইজ পরিবর্তন করার বিষয়টি ম্যানেজ করে। উইন্ডোর সাইজ অটোমেটিক সবচেয়ে ভালো ডাইমেনশনে লক করা হয়। আপনার গেমের প্রাথমিক ওরিয়েন্টেশন ল্যান্ডস্কেপ হলে, আপনাকে অন্তত ১৬:৯ অ্যাস্পেক্ট রেশিও এবং পোর্ট্রেট মোড হলে, ৯:১৬ অ্যাস্পেক্ট রেশিও সাপোর্ট করতে হবে। সেরা অভিজ্ঞতার জন্য, ল্যান্ডস্কেপ গেমের জন্য ২১:৯, ১৬:১০ এবং ৩:২ অ্যাস্পেক্ট রেশিও স্পষ্টভাবে সাপোর্ট করুন। এখানে উইন্ডো রিসাইজ করার সুবিধা না থাকলেও চলবে, তবে অন্যান্য ফর্ম ফ্যাক্টর কম্প্যাটিবিলিটির জন্য এটি থাকলে ভালো হয়।

আরও তথ্য ও পেশাদার পদ্ধতি সম্পর্কে জানতে, পিসি (PC)-তে Google Play Games-এর জন্য গ্রাফিক্স কনফিগার করুন দেখুন।

বড় স্ক্রিন

বড় স্ক্রিনের ট্যাবলেট, ফোল্ডেবল, Googlebook, ChromeOS এবং কানেক্ট করা ডিসপ্লেতে ফুল স্ক্রিনে আপনার গেমের জন্য দেখার জায়গা বড় করতে, ফুল-স্ক্রিন ইমারসিভ মোড সাপোর্ট করুন এবং decorView, সিস্টেম UI দৃশ্যমানতা বা WindowInsetsCompat API-এর মাধ্যমে ফ্ল্যাগ সেট করে সিস্টেম বার লুকান। এছাড়াও, আপনি রোটেশন ও সাইজ পরিবর্তন সংক্রান্ত কনফিগারেশন ইভেন্ট সুন্দরভাবে ম্যানেজ করতে বা সেগুলি হওয়া আটকাতে চাইবেন।

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

ছবি ১. কনফিগারেশন মানানসই সংক্রান্ত ডায়ালগ।

কিছু ডিভাইসে, কোনও প্লেয়ার কাজ করে না এমন কনফিগারেশনে গেলে, তাকে গেম রিলোড করার বিকল্প সহ প্রম্পট করা হতে পারে এবং নতুন উইন্ডো লেআউটে সবচেয়ে ভালোভাবে ফিট করার জন্য অ্যাক্টিভিটি আবার তৈরি করতে বলা হতে পারে, যা খেলার অভিজ্ঞতাকে ব্যাহত করে। বিভিন্ন মাল্টি-উইন্ডো মোড কনফিগারেশনে (২/৩, ১/২, ১/৩ উইন্ডো সাইজ) আপনার গেম পরীক্ষা করুন এবং যাচাই করুন যে কোনও গেমপ্লে বা UI এলিমেন্ট কেটে যাচ্ছে না বা অ্যাক্সেস করা যাচ্ছে না। এছাড়াও, ফোল্ডেবল ডিভাইসের ভিতরের ও বাইরের স্ক্রিনের মধ্যে পরিবর্তন করার সময় আপনার গেম ফোল্ডেবল কন্টিনিউইটিতে কীভাবে রেসপন্স করে তা পরীক্ষা করুন। আপনি সমস্যা দেখতে পেলে, এইসব কনফিগারেশন ইভেন্ট স্পষ্টভাবে ম্যানেজ করুন এবং উন্নত বড় স্ক্রিন রিসাইজ করার সুবিধা যোগ করুন।

বড় স্ক্রিনের সাইজ পরিবর্তন করার উন্নত সুবিধা

ছবি ২. ডেস্কটপ এবং টেবিলটপ ভঙ্গিতে ফোল্ডেবল ডিভাইসে বিভিন্ন UI।

কম্প্যাটিবিলিটি মোড থেকে বেরিয়ে আসতে এবং অ্যাক্টিভিটি রিক্রিয়েশন এড়াতে, নিম্নলিখিত ধাপগুলি অনুসরণ করুন:

  1. আপনার প্রধান অ্যাক্টিভিটি ছোট-বড় করা যাবে বলে ঘোষণা করুন:

    <android:resizeableActivity="true" />
    
  2. সব বড় স্ক্রিন কনফিগারেশন ইভেন্ট পেতে আপনার গেম ম্যানিফেস্টের <activity> এলিমেন্টের android:configChanges অ্যাট্রিবিউটে "orientation", "screenSize", "smallestScreenSize", "screenLayout" এবং "density"-এর জন্য এক্সপ্লিসিট সাপোর্ট ঘোষণা করুন:

    <android:configChanges="screenSize | smallestScreenSize | screenLayout | orientation | keyboard |
                            keyboardHidden | density" />
    
  3. onConfigurationChanged() ওভাররাইড করুন এবং বর্তমান ওরিয়েন্টেশন, উইন্ডোর সাইজ, প্রস্থ ও উচ্চতা সহ কনফিগারেশন ইভেন্ট ম্যানেজ করুন:

    Kotlin

    override fun onConfigurationChanged(newConfig: Configuration) {
       super.onConfigurationChanged(newConfig)
       val density: Float = resources.displayMetrics.density
       val newScreenWidthPixels =
    (newConfig.screenWidthDp * density).toInt()
       val newScreenHeightPixels =
    (newConfig.screenHeightDp * density).toInt()
    
       // Configuration.ORIENTATION_PORTRAIT or ORIENTATION_LANDSCAPE
       val newScreenOrientation: Int = newConfig.orientation
    
       // ROTATION_0, ROTATION_90, ROTATION_180, or ROTATION_270
       val newScreenRotation: Int =
    windowManager.defaultDisplay.rotation
    }

    জাভা

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
       super.onConfigurationChanged(newConfig);
       float density = getResources().getDisplayMetrics().density;
       int newScreenWidthPixels = (int) (newConfig.screenWidthDp * density);
       int newScreenHeightPixels = (int) (newConfig.screenHeightDp * density);
    
       // Configuration.ORIENTATION_PORTRAIT or ORIENTATION_LANDSCAPE
       int newScreenOrientation = newConfig.orientation;
    
       // ROTATION_0, ROTATION_90, ROTATION_180, or ROTATION_270
       int newScreenRotation = getWindowManager().getDefaultDisplay()
               .getRotation();
    }

এছাড়াও, বর্তমান ডিভাইস রোটেশন চেক করতে আপনি WindowManager কোয়েরি করতে পারেন। এই মেটাডেটা ব্যবহার করে, নতুন উইন্ডোর মাপ চেক করুন এবং সম্পূর্ণ উইন্ডোর সাইজে রেন্ডার করুন। অ্যাস্পেক্ট রেশিওর পার্থক্যের কারণে এটি সব ক্ষেত্রে কাজ নাও করতে পারে, তাই বিকল্প হিসেবে, আপনার গেম UI নতুন উইন্ডো সাইজে অ্যাঙ্কর করুন এবং আপনার মূল গেমপ্লে কন্টেন্ট লেটারবক্স করুন। কোনও টেকনিক্যাল বা ডিজাইন সংক্রান্ত সীমাবদ্ধতার কারণে যদি কোনও পদ্ধতিই কাজ না করে, তাহলে অ্যাস্পেক্ট রেশিও বজায় রাখতে, আপনার নিজস্ব ইন-ইঞ্জিন লেটারবক্সিং করুন এবং resizeableActivity = false ঘোষণা করার সময় ও কনফিগারেশন মোড এড়িয়ে যাওয়ার সময়, সম্ভাব্য সেরা ডাইমেনশনে স্কেল করুন।

আপনি যে পদ্ধতিই অবলম্বন করুন না কেন, বিভিন্ন কনফিগারেশনে আপনার গেম পরীক্ষা করুন (ফোল্ড ও আনফোল্ড, বিভিন্ন রোটেশন পরিবর্তন, স্প্লিট‑স্ক্রিন মোড) এবং নিশ্চিত করুন যে গেমের মধ্যে UI এলিমেন্ট কাট‑অফ বা ওভারল্যাপ হচ্ছে না, টাচ‑টার্গেট অ্যাক্সেসিবিলিটি সংক্রান্ত সমস্যা বা অ্যাস্পেক্ট রেশিও সংক্রান্ত সমস্যা নেই যার কারণে গেমটি স্ট্রেচ, স্কোয়াশ বা অন্য কোনওভাবে বিকৃত হয়ে যাচ্ছে।

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

একাধিক উইন্ডো মোড

মাল্টি-উইন্ডো মোড একাধিক অ্যাপকে একই স্ক্রিন একসাথে শেয়ার করার সুবিধা দেয়। মাল্টি-উইন্ডো মোড অ্যাক্টিভিটি লাইফসাইকেল পরিবর্তন করে না; তবে, একাধিক উইন্ডোতে অ্যাপের রিজুম করা স্টেট Android-এর বিভিন্ন ভার্সনে আলাদা হয় (মাল্টি-উইন্ডো মোড সংক্রান্ত সহায়তা-এ মাল্টি-উইন্ডো মোডে অ্যাক্টিভিটি লাইফসাইকেল দেখুন)।

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

মাল্টি-উইন্ডো মোডে রাখলে অ্যাপ্লিকেশনটি আবার ফোকাস ফিরে পাবে কিনা তার কোনও গ্যারান্টি নেই। তাই, আপনার গেম পজ করার জন্য আপনি যদি কোনও অ্যাপ স্টেট ইভেন্ট ব্যবহার করেন, তাহলে গেম আবার শুরু করার জন্য অ্যাকোয়ার ফোকাস ইভেন্টের (onWindowFocusChanged(), যেখানে ফোকাস ভ্যালু ট্রু হিসেবে সেট করা আছে) উপর নির্ভর করবেন না। পরিবর্তে, অন্যান্য ইভেন্ট হ্যান্ডলার বা স্টেট পরিবর্তন হ্যান্ডলার ব্যবহার করুন, যেমন onConfigurationChanged() বা onResume()। মনে রাখবেন, বর্তমান অ্যাক্টিভিটি মাল্টি-উইন্ডো মোডে চলছে কিনা তা শনাক্ত করতে আপনি সবসময় isInMultiWindowMode() পদ্ধতি ব্যবহার করতে পারবেন।

Googlebook, ChromeOS এবং বড় স্ক্রিনের ট্যাবলেট ও ফোল্ডেবল ডিভাইসে ডেস্কটপ উইন্ডোইংয়ের ক্ষেত্রে, প্রাথমিক উইন্ডোর মাপ একটি গুরুত্বপূর্ণ বিষয় হয়ে ওঠে। গেম ফুল-স্ক্রিন হতে হবে এমন কোনও বাধ্যবাধকতা নেই এবং সেই ক্ষেত্রে উইন্ডোর সাইজ কত হওয়া উচিত তা আপনাকে উল্লেখ করতে হবে। এটি করার জন্য দুটি সাজেস্ট করা পদ্ধতি আছে।

প্রথম বিকল্পটি আপনার Android ম্যানিফেস্টে <layout> ট্যাগে নির্দিষ্ট অ্যাট্রিবিউট ব্যবহার করে কাজ করে। defaultHeight এবং defaultWidth অ্যাট্রিবিউট প্রাথমিক ডাইমেনশন নিয়ন্ত্রণ করে। এছাড়াও, minHeight এবং minWidth অ্যাট্রিবিউটের ব্যাপারে সতর্ক থাকুন যাতে আপনার প্লেয়াররা গেম উইন্ডোকে এমন ডাইমেনশনে ছোট বড় করতে না পারে যা আপনি সাপোর্ট করেন না। সবশেষে, gravity অ্যাট্রিবিউট আছে, যা নির্ধারণ করে যে লঞ্চ করার সময় স্ক্রিনের কোথায় উইন্ডোটি দেখা যাবে। এইসব অ্যাট্রিবিউট ব্যবহার করে তৈরি করা লেআউট ট্যাগের উদাহরণ এখানে দেওয়া হল:

<layout android:defaultHeight="500dp"
        android:defaultWidth="600dp"
        android:gravity="top|end"
        android:minHeight="450dp"
        android:minWidth="300dp" />

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

এছাড়াও, আপনি Unity বা Unreal গেম ইঞ্জিন ব্যবহার করলে, লেটেস্ট ভার্সন (Unity 2019.4.40 এবং Unreal 5.3 বা তার পরবর্তী ভার্সন) ব্যবহার করছেন কিনা তা নিশ্চিত করুন, যা মাল্টি-উইন্ডো মোডের জন্য ভালো সাপোর্ট প্রদান করে।

ফোল্ডেবল পোস্টার সাপোর্ট

প্লেয়ারের নিমজ্জন ও এনগেজমেন্ট বাড়াতে, টেবিলটপের মতো ফোল্ডেবল পশ্চার সাপোর্ট করতে Jetpack WindowManager লেআউট লাইব্রেরি ব্যবহার করুন:

ছবি ৩. টেবিলটপ ভঙ্গিতে গেম, ডিসপ্লের উল্লম্ব অংশে প্রধান ভিউ, অনুভূমিক অংশে কন্ট্রোল।

Kotlin

fun isTableTopPosture(foldFeature : FoldingFeature?) : Boolean {
    contract { returns(true) implies (foldFeature != null) }
    return foldFeature?.state == FoldingFeature.State.HALF_OPENED &&
            foldFeature.orientation == FoldingFeature.Orientation.HORIZONTAL
}

জাভা

boolean isTableTopPosture(FoldingFeature foldFeature) {
    return (foldFeature != null) &&
           (foldFeature.getState() == FoldingFeature.State.HALF_OPENED) &&
           (foldFeature.getOrientation() == FoldingFeature.Orientation.HORIZONTAL);
}