Büyük ekranda yeniden boyutlandırılabilirliği destekleme

Telefonlardan farklı büyük ekran form faktörlerine geçiş, oyununuzun pencere yönetimini nasıl ele aldığıyla ilgili hususları gündeme getirir. ChromeOS ve PC Üzerinde Google Play Games'de oyununuz, ana masaüstü arayüzünde pencere modunda çalışabilir. Ekran genişliği 600 dp'den büyük olan Android 12L (API düzeyi 32) veya sonraki sürümleri çalıştıran yeni Android tabletlerde ve katlanabilir cihazlarda oyununuz diğer uygulamalarla birlikte bölünmüş ekran modunda yan yana çalışabilir, yeniden boyutlandırılabilir ve hatta katlanabilir cihazlarda iç ve dış ekran arasında taşınabilir. Bu da pencere boyutu ve bazı cihazlarda yön için yapılandırma değişikliğine neden olur.

Unity oyunlarında yeniden boyutlandırma

Temel büyük ekran yapılandırması

Oyununuzun yeniden boyutlandırılıp boyutlandırılamayacağını belirtin:

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

Boyutlandırma desteklenmiyorsa oyun manifestinde desteklenen minimum ve maksimum en boy oranlarının açıkça tanımlandığından emin olun:

<!-- 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 Üzerinde Google Play Games

PC'de Google Play Games için platform, belirtilen en boy oranına saygı göstererek pencerenin yeniden boyutlandırılabilirliğini yönetir. Pencere boyutu, otomatik olarak en uygun boyutlara kilitlenir. Birincil yönünüz yataysa en az 16:9 en boy oranını, oyununuz dikey moddaysa 9:16 en boy oranını desteklemeniz gerekir. En iyi deneyim için yatay oyunlarda 21:9, 16:10 ve 3:2 en boy oranlarını açıkça destekleyin. Pencerenin yeniden boyutlandırılabilir olması zorunlu değildir ancak diğer form faktörü uyumluluğu için yine de iyi bir özelliktir.

Daha fazla bilgi ve en iyi uygulamalar için PC Üzerinde Google Play Games için grafikleri yapılandırma başlıklı makaleyi inceleyin.

ChromeOS ve Android büyük ekranlar

ChromeOS ve geniş ekranlı Android cihazlarda oyununuzun tam ekranda görüntülenebilir alanını en üst düzeye çıkarmak için tam ekran tam sayfa modunu destekleyin ve decorView, sistem kullanıcı arayüzü görünürlüğü veya WindowInsetsCompat API'si üzerinden işaretler ayarlayarak sistem çubuklarını gizleyin. Ayrıca, döndürme ve yeniden boyutlandırma yapılandırma etkinliklerini sorunsuz bir şekilde işlemek veya ChromeOS cihazlarda bunların gerçekleşmesini engellemek isteyebilirsiniz.

Oyununuzun, büyük ekranlı Android cihazlarda daha önce kullanmadığınız yapılandırmalarda çalışabileceğini unutmayın. Oyununuz tüm pencere boyutu ve yönü yapılandırmalarını desteklemiyorsa platform, uyumluluk modunda oyununuzu sinemaskop moduna alır ve gerekirse desteklenmeyen bir yapılandırmaya geçmeden önce oyuncudan onay ister.

Şekil 1. Yapılandırma uyumluluğu iletişim kutusu.

Bazı cihazlarda, oyuncu desteklenmeyen bir yapılandırmaya geçtiğinde oyunu yeniden yükleme ve etkinliği yeni pencere düzenine en uygun şekilde yeniden oluşturma seçeneği sunulabilir. Bu da oyun deneyimini kesintiye uğratır. Oyununuzu çeşitli çoklu pencere modu yapılandırmalarında (2/3, 1/2, 1/3 pencere boyutu) test edin ve hiçbir oyun öğesinin veya kullanıcı arayüzü öğesinin kırpılmadığından ya da erişilemez durumda olmadığından emin olun. Ayrıca, katlanabilir cihazlarda iç ve dış ekran arasında geçiş yapıldığında oyununuzun katlanabilir cihazlarda kesintisizliğe nasıl yanıt verdiğini test edin. Sorun görürseniz bu yapılandırma etkinliklerini açıkça ele alın ve büyük ekranlarda gelişmiş yeniden boyutlandırma desteği ekleyin.

Büyük ekranlarda gelişmiş yeniden boyutlandırma

Şekil 2. Masaüstünde ve katlanabilir cihazda masaüstü modunda farklı kullanıcı arayüzleri.

Uyumluluk modundan çıkmak ve etkinliğin yeniden oluşturulmasını önlemek için aşağıdakileri yapın:

  1. Ana etkinliğinizi yeniden boyutlandırılabilir olarak tanımlayın:

    <android:resizeableActivity="true" />
    
  2. Tüm büyük ekran yapılandırma etkinliklerini almak için oyun manifestinizin <activity> öğesinin android:configChanges özelliğinde "orientation", "screenSize", "smallestScreenSize", "screenLayout" ve "density" için açık destek beyan edin:

    <android:configChanges="screenSize | smallestScreenSize | screenLayout | orientation | keyboard |
                            keyboardHidden | density" />
    
  3. onConfigurationChanged() değerini geçersiz kılın ve mevcut yön, pencere boyutu, genişlik ve yükseklik dahil olmak üzere yapılandırma etkinliğini yönetin:

    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();
    }

Mevcut cihaz dönüşünü kontrol etmek için WindowManager değerini de sorgulayabilirsiniz. Bu meta verileri kullanarak yeni pencere boyutlarını kontrol edin ve tam pencere boyutunda oluşturma işlemini gerçekleştirin. Bu, en boy oranı farklılıkları nedeniyle her durumda işe yaramayabilir. Alternatif olarak, oyun kullanıcı arayüzünüzü yeni pencere boyutuna sabitleyebilir ve temel oyun içeriğinizi sinemaskop biçiminde gösterebilirsiniz. Her iki yaklaşımı da engelleyen teknik veya tasarım sınırlamaları varsa en boy oranını korumak için kendi motor içi sinemaskopunuzu oluşturun ve resizeableActivity = false'ü tanımlarken yapılandırma modundan kaçınarak mümkün olan en iyi boyutlara ölçeklendirin.

Hangi yaklaşımı benimserseniz benimseyin oyununuzu çeşitli yapılandırmalarda test edin (katlama ve açma, farklı döndürme değişiklikleri, bölünmüş ekran modu). Oyun içi kullanıcı arayüzü öğelerinin kesilmiş veya örtüşen olmadığından, dokunma hedefi erişilebilirliğiyle ilgili sorunlardan veya oyunun uzamasına, sıkıştırılmasına ya da başka bir şekilde bozulmasına neden olan en boy oranı sorunlarından emin olun.

Ayrıca, çok daha büyük bir alan için aynı sayıda piksele sahip olduğunuzdan, daha büyük ekranlar genellikle daha büyük pikseller anlamına gelir. Bu durum, boyutu küçültülmüş oluşturma arabelleklerinde veya düşük çözünürlüklü öğelerde pikselleşmeye neden olabilir. Büyük ekranlı cihazlarda en yüksek kaliteli öğelerinizi kullanın ve sorun yaşamamak için oyununuzun performans profilini oluşturun. Oyununuz birden fazla kalite düzeyini destekliyorsa büyük ekranlı cihazları hesaba kattığınızdan emin olun.

Birden fazla pencere modu

Çoklu pencere modu, birden fazla uygulamanın aynı ekranı aynı anda paylaşmasına olanak tanır. Çoklu pencere modu, etkinlik yaşam döngüsünü değiştirmez. Ancak birden fazla pencerede devam ettirilen uygulamaların durumu, Android'in farklı sürümlerinde farklılık gösterir (Çoklu pencere modunu destekleme bölümündeki Çoklu pencere modunda etkinlik yaşam döngüsü bölümüne bakın).

Oyuncu bir uygulamayı veya oyunu çoklu pencere moduna aldığında sistem, Geniş ekranda gelişmiş yeniden boyutlandırma bölümünde belirtildiği gibi yapılandırma değişikliği etkinliğini bildirir. Oyuncu oyunu yeniden boyutlandırdığında veya oyunu tekrar tam ekran moduna geçirdiğinde de yapılandırma değişikliği gerçekleşir.

Uygulamanın çoklu pencere moduna alındığında tekrar odaklanacağı garanti edilmez. Bu nedenle, oyununuzu duraklatmak için uygulama durumu etkinliklerinden herhangi birini kullanıyorsanız oyunu devam ettirmek için odağı edinme etkinliğini (odak değeri true olan onWindowFocusChanged()) kullanmayın. Bunun yerine onConfigurationChanged() veya onResume() gibi diğer etkinlik işleyicileri ya da durum değişikliği işleyicileri kullanın. Mevcut etkinliğin çok pencere modunda çalışıp çalışmadığını tespit etmek için dilediğiniz zaman isInMultiWindowMode() yöntemini kullanabileceğinizi unutmayın.

ChromeOS'te çoklu pencere modu kullanıldığında ilk pencere boyutları önemli bir unsur haline gelir. Oyunların tam ekran olması gerekmez. Bu durumda, pencerenin boyutunun ne olması gerektiğini belirtmeniz gerekir. Bu konuya yaklaşmanın iki önerilen yolu vardır.

İlk seçenek, Android manifest dosyanızdaki <layout> etiketinde belirli özellikleri kullanarak çalışır. defaultHeight ve defaultWidth özellikleri ilk boyutları kontrol eder. Oyuncularınızın oyun penceresini desteklemediğiniz boyutlara yeniden boyutlandırmasını önlemek için minHeight ve minWidth özelliklerini de kullanın. Son olarak, pencerenin başlatıldığında ekranın neresinde görüneceğini belirleyen gravity özelliği vardır. Bu özellikleri kullanan örnek bir düzen etiketi aşağıda verilmiştir:

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

Pencere boyutunu ayarlamayla ilgili ikinci seçenek, dinamik başlatma sınırları kullanılarak çalışır. setLaunchBounds(Rect)⁠⁠ kullanarak başlangıç aralığı boyutlarını tanımlayabilirsiniz. Boş bir dikdörtgen belirtilirse etkinlik, en üst düzeyde başlatılır.

Ayrıca, Unity veya Unreal oyun motorlarını kullanıyorsanız çoklu pencere modunu iyi destekleyen yeni bir sürüm (Unity 2019.4.40 ve Unreal 5.3 veya daha yeni) kullandığınızdan emin olun.

Katlanabilir duruş desteği

Oyuncuların oyuna olan ilgisini ve etkileşimini artırmak için masaüstü gibi katlanabilir duruşları desteklemek üzere Jetpack WindowManager düzen kitaplığını kullanın:

3.şekil Ekranın dikey kısmında ana görünüm, yatay kısmında kontroller bulunan masaüstü oyun.

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);
}