फ़ोन से बड़ी स्क्रीन वाले अलग-अलग फ़ॉर्म फ़ैक्टर पर गेम को उपलब्ध कराने पर, यह ध्यान रखना ज़रूरी हो जाता है कि आपका गेम, विंडो मैनेजमेंट को कैसे हैंडल करता है. ChromeOS और Google Play Games on PC पर, आपका गेम मुख्य डेस्कटॉप इंटरफ़ेस पर विंडो मोड में चल सकता है. नए Android टैबलेट और फ़ोल्ड किए जा सकने वाले डिवाइसों पर, Android 12L (एपीआई लेवल 32) या उसके बाद के वर्शन वाले डिवाइसों की स्क्रीन की चौड़ाई 600dp से ज़्यादा होने पर, आपका गेम अन्य ऐप्लिकेशन के साथ स्प्लिट-स्क्रीन मोड में एक साथ चल सकता है. साथ ही, गेम का साइज़ बदला जा सकता है और फ़ोल्ड किए जा सकने वाले डिवाइसों पर, उसे अंदरूनी और बाहरी डिसप्ले के बीच भी ले जाया जा सकता है. इससे विंडो के साइज़ और कुछ डिवाइसों पर ओरिएंटेशन के कॉन्फ़िगरेशन में बदलाव होता है.
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">
Google Play Games on PC
Google Play Games on PC के लिए, प्लैटफ़ॉर्म, तय किए गए आसपेक्ट रेशियो के हिसाब से विंडो के साइज़ में बदलाव करता है. विंडो का साइज़, सबसे सही डाइमेंशन पर अपने-आप लॉक हो जाता है. अगर आपके गेम का मुख्य ओरिएंटेशन लैंडस्केप है, तो आपको कम से कम 16:9 आसपेक्ट रेशियो का इस्तेमाल करना होगा. अगर आपका गेम पोर्ट्रेट मोड में है, तो 9:16 आसपेक्ट रेशियो का इस्तेमाल करना होगा. बेहतर अनुभव के लिए, लैंडस्केप मोड में चलने वाले गेम के लिए, 21:9, 16:10, और 3:2 आसपेक्ट रेशियो (लंबाई-चौड़ाई का अनुपात) का इस्तेमाल करें. यहां विंडो का साइज़ बदलने की ज़रूरत नहीं है. हालांकि, अन्य फ़ॉर्म फ़ैक्टर के साथ काम करने के लिए, ऐसा करना अच्छा होता है.
ज़्यादा जानकारी और सबसे सही तरीके जानने के लिए, पीसी के लिए Google Play Games के ग्राफ़िक कॉन्फ़िगर करना लेख पढ़ें.
ChromeOS और Android की बड़ी स्क्रीन
ChromeOS और बड़ी स्क्रीन वाले Android डिवाइसों पर, अपने गेम को फ़ुल स्क्रीन में देखने के लिए, फ़ुल स्क्रीन इमर्सिव मोड की सुविधा उपलब्ध कराएं. साथ ही, decorView
, सिस्टम यूज़र इंटरफ़ेस (यूआई) की सेटिंग या WindowInsetsCompat
एपीआई की मदद से फ़्लैग सेट करके, सिस्टम बार छिपाएं. आपको कॉन्फ़िगरेशन इवेंट के दौरान, डिवाइस के रोटेशन और साइज़ में बदलाव को आसानी से मैनेज करना होगा या उन्हें ChromeOS डिवाइसों पर होने से रोकना होगा.
ध्यान दें कि बड़ी स्क्रीन वाले Android डिवाइसों पर, आपका गेम ऐसे कॉन्फ़िगरेशन में चल सकता है जिन्हें शायद आपने पहले मैनेज न किया हो. अगर आपका गेम, विंडो के सभी साइज़ और ओरिएंटेशन कॉन्फ़िगरेशन के साथ काम नहीं करता, तो प्लैटफ़ॉर्म आपके गेम को कंपैटिबिलिटी मोड में लेटरबॉक्स करता है. साथ ही, ज़रूरत पड़ने पर, गेम को किसी ऐसे कॉन्फ़िगरेशन में बदलने से पहले, प्लेयर को सूचना देता है जो काम नहीं करता.

जब कोई खिलाड़ी कुछ ऐसे डिवाइसों पर गेम खेलता है जिन पर यह काम नहीं करता, तो उसे गेम को फिर से लोड करने और गतिविधि को फिर से बनाने का विकल्प मिल सकता है, ताकि वह नई विंडो के लेआउट में सबसे अच्छी तरह से फ़िट हो सके. इससे गेम खेलने के अनुभव में रुकावट आती है. अपने गेम को मल्टी-विंडो मोड के अलग-अलग कॉन्फ़िगरेशन (2/3, 1/2, 1/3 विंडो साइज़) में टेस्ट करें. साथ ही, यह पुष्टि करें कि कोई भी गेमप्ले या यूज़र इंटरफ़ेस (यूआई) एलिमेंट न तो काटा गया हो और न ही उस पर ऐक्सेस न किया जा सके. इसके अलावा, यह भी जांचें कि फ़ोल्ड किए जा सकने वाले डिवाइसों पर, अंदरूनी और बाहरी स्क्रीन के बीच स्विच करने पर, आपका गेम कैसे काम करता है. अगर आपको समस्याएं दिखती हैं, तो इन कॉन्फ़िगरेशन इवेंट को साफ़ तौर पर मैनेज करें. साथ ही, बड़ी स्क्रीन के साइज़ में बदलाव करने की सुविधा जोड़ें.
बड़ी स्क्रीन पर, वीडियो के साइज़ में बदलाव करने की बेहतर सुविधा
Compatibility Mode से बाहर निकलने और गतिविधि को फिर से बनाने से बचने के लिए, यह तरीका अपनाएं:
अपनी मुख्य गतिविधि को, विंडो के हिसाब से साइज़ बदलने की सुविधा के तौर पर सेट करें:
<android:resizeableActivity="true" />
बड़ी स्क्रीन के सभी कॉन्फ़िगरेशन इवेंट पाने के लिए, अपने गेम मेनिफ़ेस्ट के
<activity>
एलिमेंट केandroid:configChanges
एट्रिब्यूट में, "ओरिएंटेशन", "स्क्रीन साइज़", "सबसे छोटी स्क्रीन साइज़", "स्क्रीन लेआउट", और "डेंसिटी" के लिए साफ़ तौर पर बताएं:<android:configChanges="screenSize | smallestScreenSize | screenLayout | orientation | keyboard | keyboardHidden | density" />
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 }
Java
@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
से भी क्वेरी की जा सकती है. इस मेटाडेटा का इस्तेमाल करके, विंडो के नए डाइमेंशन देखें और विंडो को फ़ुल साइज़ में रेंडर करें. हो सकता है कि आसपेक्ट रेशियो में अंतर की वजह से, यह सभी मामलों में काम न करे. इसलिए, इसके बजाय, अपने गेम के यूज़र इंटरफ़ेस (यूआई) को नई विंडो के साइज़ पर अटैच करें और गेमप्ले के मुख्य कॉन्टेंट को लेटरबॉक्स में बदलें. अगर तकनीकी या डिज़ाइन से जुड़ी सीमाओं की वजह से, इनमें से किसी भी तरीके का इस्तेमाल नहीं किया जा सकता, तो आसपेक्ट रेशियो को बनाए रखने के लिए, इंजन में लेटरबॉक्सिंग की सुविधा का इस्तेमाल करें. साथ ही, resizeableActivity = false
का एलान करते समय, सबसे अच्छे डाइमेंशन पर स्केल करें और कॉन्फ़िगरेशन मोड का इस्तेमाल न करें.
कोई भी तरीका अपनाने पर, अपने गेम को अलग-अलग कॉन्फ़िगरेशन में टेस्ट करें (फ़ोल्ड और अनफ़ोल्ड, रोटेशन में बदलाव, स्प्लिट-स्क्रीन मोड). साथ ही, पक्का करें कि गेम में यूज़र इंटरफ़ेस (यूआई) के एलिमेंट कट-ऑफ़ या ओवरलैप न हों. इसके अलावा, टच-टारगेट ऐक्सेस करने में कोई समस्या न हो या आसपेक्ट रेशियो से जुड़ी कोई समस्या न हो, जिसकी वजह से गेम का साइज़ बड़ा, छोटा या खराब हो गया हो.
इसके अलावा, आम तौर पर बड़ी स्क्रीन का मतलब ज़्यादा पिक्सल होता है, क्योंकि आपके पास ज़्यादा बड़े हिस्से के लिए उतने ही पिक्सल होते हैं. इससे, कम किए गए साइज़ के रेंडर बफ़र या कम रिज़ॉल्यूशन वाली एसेट के लिए पिक्सलेशन हो सकता है. बड़ी स्क्रीन वाले डिवाइसों पर, सबसे अच्छी क्वालिटी वाली एसेट का इस्तेमाल करें. साथ ही, अपने गेम की परफ़ॉर्मेंस प्रोफ़ाइल बनाएं, ताकि यह पक्का किया जा सके कि कोई समस्या न हो. अगर आपका गेम अलग-अलग क्वालिटी लेवल पर काम करता है, तो पक्का करें कि वह बड़ी स्क्रीन वाले डिवाइसों पर भी काम करता हो.
एकाधिक विंडो मोड
मल्टी-विंडो मोड की मदद से, एक ही स्क्रीन पर एक से ज़्यादा ऐप्लिकेशन इस्तेमाल किए जा सकते हैं. मल्टी-विंडो मोड, ऐक्टिविटी लाइफ़साइकल में बदलाव नहीं करता. हालांकि, Android के अलग-अलग वर्शन में, एक से ज़्यादा विंडो में ऐप्लिकेशन के फिर से शुरू होने की स्थिति अलग-अलग होती है. मल्टी-विंडो मोड की सुविधा में जाकर, मल्टी-विंडो मोड में ऐक्टिविटी लाइफ़साइकल देखें.
जब प्लेयर किसी ऐप्लिकेशन या गेम को मल्टी-विंडो मोड में डालता है, तो सिस्टम कॉन्फ़िगरेशन में हुए बदलाव की सूचना देता है. इस बारे में बड़ी स्क्रीन के साइज़ में बदलाव करने की बेहतर सुविधा सेक्शन में बताया गया है. जब प्लेयर गेम का साइज़ बदलता है या उसे फिर से फ़ुल स्क्रीन मोड में डालता है, तब भी कॉन्फ़िगरेशन में बदलाव होता है.
इस बात की कोई गारंटी नहीं है कि मल्टी-विंडो मोड में जाने पर, ऐप्लिकेशन पर फ़ोकस वापस आ जाएगा. इसलिए, अगर गेम को रोकने के लिए ऐप्लिकेशन की स्थिति से जुड़े किसी भी इवेंट का इस्तेमाल किया जाता है, तो गेम को फिर से शुरू करने के लिए, फ़ोकस हासिल करने वाले इवेंट (फ़ोकस वैल्यू के तौर पर 'सही' के साथ onWindowFocusChanged()
) पर भरोसा न करें. इसके बजाय, onConfigurationChanged()
या onResume()
जैसे दूसरे इवेंट हैंडलर या स्टेटस में बदलाव करने वाले हैंडलर का इस्तेमाल करें. ध्यान दें कि मौजूदा गतिविधि मल्टी-विंडो मोड में चल रही है या नहीं, यह पता लगाने के लिए isInMultiWindowMode()
तरीके का इस्तेमाल कभी भी किया जा सकता है.
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 }
Java
boolean isTableTopPosture(FoldingFeature foldFeature) { return (foldFeature != null) && (foldFeature.getState() == FoldingFeature.State.HALF_OPENED) && (foldFeature.getOrientation() == FoldingFeature.Orientation.HORIZONTAL); }